home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / edit / thesrc20.zip / query.c < prev    next >
C/C++ Source or Header  |  1995-01-26  |  112KB  |  3,258 lines

  1. /***********************************************************************/
  2. /* QUERY.C -                                                           */
  3. /* This file contains functions related to QUERY,STATUS and EXTRACT    */
  4. /***********************************************************************/
  5. /*
  6.  * THE - The Hessling Editor. A text editor similar to VM/CMS xedit.
  7.  * Copyright (C) 1991-1995 Mark Hessling
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License as
  11.  * published by the Free Software Foundation; either version 2 of
  12.  * the License, or any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17.  * General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to:
  21.  *
  22.  *    The Free Software Foundation, Inc.
  23.  *    675 Mass Ave,
  24.  *    Cambridge, MA 02139 USA.
  25.  *
  26.  *
  27.  * If you make modifications to this software that you feel increases
  28.  * it usefulness for the rest of the community, please email the
  29.  * changes, enhancements, bug fixes as well as any and all ideas to me.
  30.  * This software is going to be maintained and enhanced as deemed
  31.  * necessary by the community.
  32.  *
  33.  * Mark Hessling                     email: M.Hessling@gu.edu.au
  34.  * 36 David Road                     Phone: +61 7 849 7731
  35.  * Holland Park                      Fax:   +61 7 875 5314
  36.  * QLD 4121
  37.  * Australia
  38.  */
  39.  
  40. /*
  41. $Id: query.c 2.0 1995/01/26 16:31:43 MH Release MH $
  42. */
  43.  
  44. #include <stdio.h>
  45.  
  46. #include "the.h"
  47. #include "proto.h"
  48. #include "query.h"
  49.  
  50. #ifdef PROTO
  51. static short extract_pending(short,CHARTYPE *);
  52. static short extract_point(short,CHARTYPE *);
  53. static short extract_prefix(short,CHARTYPE *);
  54. #else
  55. static short extract_pending();
  56. static short extract_point();
  57. static short extract_prefix();
  58. #endif
  59.  
  60. /*man-start*********************************************************************
  61.  
  62.  
  63. ========================================================================
  64. QUERY, EXTRACT and STATUS
  65. ========================================================================
  66.  
  67.      The following lists the valid variables that can be queried and
  68.      also shows what values are returned. For both QUERY and STATUS,
  69.      the values are concatenated together and displayed as a single
  70.      line. For EXTRACT the REXX variables that are set are defined.
  71.      The capitalised portion of the variable is the minimum abbreviation
  72.      recognised.
  73.      The bracketed text at the end of the description indicates from
  74.      which commands a valid response will be supplied (Q-Query,E-Extract
  75.      M-Modify and S-Status).
  76.  
  77. ALT
  78.      The number of alterations to the current file since the last SAVE
  79.      or AUTOSAVE.
  80.      (QES)
  81.  
  82.      alt.0           - 2
  83.      alt.1           - Number of alterations since last SAVE or AUTOSAVE
  84.      alt.2           - Number of alterations since last SAVE
  85.  
  86. ARBchar
  87.      The status of ARBCHAR and the ARBCHAR characters.
  88.      (QEMS)
  89.  
  90.      arbchar.0       - 3
  91.      arbchar.1       - ON|OFF
  92.      arbchar.2       - multiple match character
  93.      arbchar.3       - single match character
  94.  
  95. AUtosave
  96.      The status of AUTOSAVE and/or the frequency setting.
  97.      (QEMS)
  98.  
  99.      autosave.0      - 1
  100.      autosave.1      - OFF|n
  101.  
  102. BACKup
  103.      Indicates if a .bak file is kept after editing.
  104.      (QEMS)
  105.  
  106.      backup.0        - 1
  107.      backup.1        - ON|OFF|TEMP|KEEP
  108.  
  109. BEEP
  110.      Indicates if the bell is sounded on display of error messages.
  111.      (QEMS)
  112.  
  113.      beep.0          - 1
  114.      beep.1          - ON|OFF
  115.  
  116. BLOCK
  117.      Returns information about the marked block, if any.
  118.      (E)
  119.  
  120.      block.0         - 6 if a marked block exists, or 1 for NONE
  121.      block.1         - type of marked block (LINE|BOX|NONE|WORD|COLUMN)
  122.      block.2         - line number of start of block
  123.      block.3         - column number of start of block
  124.      block.4         - line number of end of block
  125.      block.5         - column number of end of block
  126.      block.6         - file name containing marked block
  127.  
  128. CASE
  129.      The settings related to the CASE of characters entered, searched
  130.      for, changed and sorted.
  131.      (QEMS)
  132.  
  133.      case.0          - 4
  134.      case.1          - MIXED|UPPER|LOWER
  135.      case.2          - RESPECT|IGNORE
  136.      case.3          - RESPECT|IGNORE
  137.      case.4          - RESPECT|IGNORE
  138.  
  139. CLEARScreen
  140.      Indicates if the screen is cleared on exit from THE.
  141.      (QEMS)
  142.  
  143.      clearscreen.0   - 1
  144.      clearscreen.1   - ON|OFF
  145.  
  146. CLOCK
  147.      Indicates if the time is displayed on the status line.
  148.      (QEMS)
  149.  
  150.      clock.0         - 1
  151.      clock.1         - ON|OFF
  152.  
  153. CMDArrows
  154.      Returns the settings for arrow key behaviour.
  155.      (QEMS)
  156.  
  157.      cmdarrows.0     - 1
  158.      cmdarrows.1     - RETRIEVE|TAB
  159.  
  160. CMDline
  161.      The settings for the command line.
  162.      (QEMS)
  163.  
  164.      If CMDLINE OFF
  165.  
  166.      cmdline.0       - 1
  167.      cmdline.1       - OFF
  168.  
  169.      If CMDLINE ON, BOTTOM or TOP
  170.  
  171.      cmdline.0       - 3
  172.      cmdline.1       - ON|TOP|BOTTOM
  173.      cmdline.2 *     - line number within window of command line
  174.      cmdline.3 *     - contents of command line
  175.                * these values are only returned with EXTRACT
  176.  
  177. COMPAT
  178.      The settings for the compatibility mode.
  179.      (QEMS)
  180.  
  181.      compat.0        - 1
  182.      compat.1        - THE|XEDIT|KEDIT
  183.  
  184. CURline
  185.      The value and position of the current line within the current file.
  186.      (QEMS)
  187.  
  188.      With EXTract command:
  189.  
  190.      curline.0       - 3
  191.      curline.1       - curline setting
  192.      curline.2       - line number within window of current line
  193.      curline.3       - contents of current line
  194.  
  195.      With Query,Modify and Status commands:
  196.  
  197.      curline.0       - 1
  198.      curline.1       - curline setting
  199.  
  200. CURSor
  201.      The position of the cursor within the displayed screen and file
  202.      at the time the EXTRACT /CURSOR/ is issued and the position of
  203.      the cursor at the time the macro was issued.
  204.      If the cursor is not in the file area, then line and column
  205.      values will be set to -1.
  206.      (QE)
  207.  
  208.      cursor.0        - 8
  209.      cursor.1        - line number of cursor in screen (current)
  210.      cursor.2        - column number of cursor in screen (current)
  211.      cursor.3        - line number of cursor in file (current)
  212.      cursor.4        - column number of cursor in file (current)
  213.      cursor.5        - line number of cursor in screen (original)
  214.      cursor.6        - column number of cursor in screen (original)
  215.      cursor.7        - line number of cursor in file (original)
  216.      cursor.8        - column number of cursor in file (original)
  217.  
  218. DIRFILEID
  219.      The value of the path and filename of the focus line in a DIR.DIR
  220.      file.
  221.      (E)
  222.  
  223.      dirfileid.0     - 2
  224.      dirfileid.1     - full path of directory
  225.      dirfileid.2     - file name at focus line
  226.  
  227. DISPlay
  228.      Indicates the range of selection levels current.
  229.      (QEMS)
  230.  
  231.      display.0       - 2
  232.      display.1       - display low value
  233.      display.2       - display high value
  234.  
  235. EOF
  236.      Indicates if the current line is on the *** Bottom of file *** line.
  237.      (QES)
  238.  
  239.      eof.0           - 1
  240.      eof.1           - ON|OFF
  241.  
  242. EOLout
  243.      Returns the value of the end-of-line character(s).
  244.      (QEMS)
  245.  
  246.      eolout.0        - 1
  247.      eolout.1        - LF|CRLF
  248.  
  249. ETMODE
  250.      Indicates if extended display mode is set.
  251.      (QEMS)
  252.  
  253.      etmode.0        - 1
  254.      etmode.1        - ON|OFF
  255.  
  256. FNAME
  257.      The file name of the current file.
  258.      (E)
  259.  
  260.      fname.0         - 1
  261.      fname.1         - File name.
  262.  
  263. FPATH
  264.      The path name of the current file. This includes a trailing
  265.      directory separator.
  266.      (E)
  267.  
  268.      fpath.0         - 1
  269.      fpath.1         - File path.
  270.  
  271. FTYPE
  272.      The extension of the current file. The characters following
  273.      the trailing '.' character.
  274.      (E)
  275.  
  276.      ftype.0         - 1
  277.      ftype.1         - File extension.
  278.  
  279. GETENV variable
  280.      The value of the supplied environment variable or ***invalid***
  281.      if the variable does not exist.
  282.      (E)
  283.  
  284.      getenv.0        - 1
  285.      getenv.1        - value of variable
  286.  
  287. HEX
  288.      Indicates if HEX is on or off.
  289.      (QEMS)
  290.  
  291.      hex.0           - 1
  292.      hex.1           - ON|OFF
  293.  
  294. HEXDISPlay
  295.      Indicates if the current character is displayed on the status line.
  296.      (QEMS)
  297.  
  298.      hexdisplay.0    - 1
  299.      hexdisplay.1    - ON|OFF
  300.  
  301. HEXShow
  302.      Returns details of HEXSHOW placement.
  303.      (QEMS)
  304.  
  305.      hexshow.0       - 2
  306.      hexshow.1       - ON|OFF
  307.      hexshow.2       - line displaying first hexshow line
  308.  
  309. IDline
  310.      Indicates if the id line is displayed for a file.
  311.      (QEMS)
  312.  
  313.      idline.0        - 1
  314.      idline.1        - ON|OFF
  315.  
  316. IMPMACro
  317.      Indicates if implied macro processing is on or off.
  318.      (QEMS)
  319.  
  320.      impmacro.0      - 1
  321.      impmacro.1      - ON|OFF
  322.  
  323. IMPOS
  324.      Indicates if implied operating system command processing is on 
  325.      or off.
  326.      (QEMS)
  327.  
  328.      impos.0         - 1
  329.      impos.1         - ON|OFF
  330.  
  331. INSERTmode
  332.      Indicates if currently in insert mode or overstrike mode.
  333.      (QEMS)
  334.  
  335.      insertmode.1    - 1
  336.      insertmode.1    - ON|OFF
  337.  
  338. LASTmsg
  339.      Return the text of the last error message generated.
  340.      (E)
  341.  
  342.      lastmsg.0       - 1
  343.      lastmsg.1       - text of last message.
  344.  
  345. LASTRC
  346.      Return code from last command issued from command line.
  347.      (QES)
  348.  
  349.      lastrc.0        - 1
  350.      lastrc.1        - Last return code.
  351.  
  352. LENgth
  353.      Length of the current line.
  354.      (QES)
  355.  
  356.      length.0        - 1
  357.      length.1        - Length of current line.
  358.  
  359. LIne
  360.      Line number of current line in current file.
  361.      (QES)
  362.  
  363.      line.0          - 1
  364.      line.1          - Line number
  365.  
  366. LINENd
  367.      Indicates if multiple commands allowed on command line
  368.      and the delimiter.
  369.      (QEMS)
  370.  
  371.      linend.0        - 2
  372.      linend.1        - ON|OFF
  373.      linend.2        - delimiter
  374.  
  375. MACROExt
  376.      The current setting for a macro's file extension.
  377.      (QEMS)
  378.  
  379.      macroext.0      - 1
  380.      macroext.1      - Default file extension
  381.  
  382. MACROPath
  383.      The path that THE looks for by default for macro files.
  384.      (QEMS)
  385.  
  386.      macropath.0     - 1
  387.      macropath.1     - Path for macro files.
  388.  
  389. MARgins
  390.      The settings for left and right margins and paragraph indent.
  391.      (QEMS)
  392.  
  393.      margins.0       - 3
  394.      margins.1       - left column
  395.      margins.2       - right column
  396.      margins.3       - indent value (column or offset from left margin)
  397.  
  398. MONITOR
  399.      Indicates if the combination of monitor and the curses package
  400.      supports colour. If the curses package supports colour, then
  401.      monitor.3 is set to COLOR and monitor.2 can be COLOR or MONO
  402.      depending on whether the monitor supports colour. If monitor.3
  403.      is MONO then monitor.2 will also be set to MONO.
  404.      (QES)
  405.  
  406.      monitor.0       - 2
  407.      monitor.1       - COLOR|MONO
  408.      monitor.2       - COLOR|MONO
  409.  
  410. MSGLine
  411.      Returns details of where the message line is displayed.
  412.      (QEMS)
  413.  
  414.      msgline.0       - 2
  415.      msgline.1       - ON
  416.      msgline.2       - line position of message line
  417.      msgline.3       - number of message lines available
  418.      msgline.4       - OVERLAY
  419.  
  420. MSGMode
  421.      Indicates if MSGMODE setting is on or off.
  422.      (QEMS)
  423.  
  424.      msgmode.0       - 1
  425.      msgmode.1       - ON|OFF
  426.  
  427. NBFile
  428.      Returns with the number of files currently in the ring.
  429.      (QES)
  430.  
  431.      nbfile.0        - 1
  432.      nbfile.1        - Number of files in ring
  433.  
  434. NEWLines
  435.      Indicates if NEWLINES variable is set to LEFT or ALIGNED.
  436.      (QEMS)
  437.  
  438.      newlines.0      - 1
  439.      newlines.1      - ALIGNED|LEFT
  440.  
  441. NONDisp
  442.      Returns the character that is displayed for extended characters
  443.      that are not displayed.
  444.      (QEMS)
  445.  
  446.      nondisp.0       - 1
  447.      nondisp.1       - char
  448.  
  449. NUMber
  450.      Indicates if line numbers are displayed in the prefix area.
  451.      (QEMS)
  452.  
  453.      number.0        - 1
  454.      number.1        - ON|OFF
  455.  
  456. PENDing [BLOCK] [OLDNAME] name|*
  457.      Returns information about pening prefix commands.
  458.      (E)
  459.  
  460.      pending.0       - 4
  461.      pending.1       - line number in file
  462.      pending.2       - newname - actual name entered in prefix area
  463.      pending.3       - oldname - original name of macro after
  464.                                  synonym resolution
  465.      pending.4       - BLOCK or null
  466.  
  467. Point [*]
  468.      Returns the name and line number of the focus line, or names and
  469.      line numbers of all lines in a file if '*' is specified.
  470.      (QEMS)
  471.  
  472.      When 'EXTract /Point' is specified:
  473.  
  474.      point.0         - 0 or 1       (0 if focus line not named)
  475.      point.1         - line number and name of line (if line is named)
  476.  
  477.      When 'EXTract /Point *' is specified:
  478.      (E)
  479.  
  480.      point.0         - number of named lines in the file
  481.      point.1         - line number and name for first named line
  482.      point.n         - line number and name for nth named line
  483.  
  484. POSition
  485.      Indicates if LINE/COL is displayed on IDLINE
  486.      (QEMS)
  487.  
  488.      position.0      - 3
  489.      position.1      - ON|OFF
  490.      position.2      - current or focus line
  491.      position.3      - current or focus column
  492.  
  493. PREfix [Synonym name|*]
  494.      Indicates if prefix is displayed for the view and if displayed
  495.      where is is displayed.
  496.      (QEMS)
  497.  
  498.      prefix.0        - 1 or 2     (1 if prefix.1 is OFF, 2 otherwise)
  499.      prefix.1        - ON|OFF|NULLS
  500.      prefix.2        - LEFT|RIGHT        (if prefix.1 is ON or NULLS)
  501.  
  502.      With [Synonym name] option, the name of the macrofile (oldname) 
  503.      is returned that is associated with the synonym, name. If name 
  504.      is not a synonym then name is returned.
  505.      (E)
  506.  
  507.      prefix.0        - 1
  508.      prefix.1        - oldname
  509.  
  510.      With [Synonym *] option, all prefix synonyms are returned.
  511.      (E)
  512.  
  513.      prefix.0        - number of prefix synonyms
  514.      prefix.1        - newname oldname
  515.      prefix.n        - newname oldname
  516.  
  517. PRINTER
  518.      Returns the value of the printer port or spooler.
  519.      (QEMS)
  520.  
  521.      printer.0       - 1
  522.      printer.1       - port or spooler name
  523.  
  524. REPROFile
  525.      Indicates if the profile file is to be re-executed for each
  526.      subsequent file to be edited.
  527.      (QEMS)
  528.  
  529.      reprofile.0     - 1
  530.      reprofile.1     - ON|OFF
  531.  
  532. REESERved
  533.      Return with list of the screen rows that have been reserved.
  534.      (QES)
  535.  
  536.      reserved.0      - 0 if no reserved lines; 1 otherwise
  537.      reserved.1      - list of screen row numbers reserved
  538.  
  539. REXXOUTput
  540.      Indicates if REXX output is captured to a file or not and the
  541.      line number limit of lines to be displayed.
  542.      (QEMS)
  543.  
  544.      rexxoutput.0    - 2
  545.      rexxoutput.1    - FILE|DISPLAY
  546.      rexxoutput.2    - line number limit
  547.  
  548. SCOPE
  549.      Returns the status of [SET] SCOPE.
  550.      (QEMS)
  551.  
  552.      scope.0         - 1
  553.      scope.1         - ALL|DISPLAY
  554.  
  555. SCALe
  556.      Returns details of SCALE line.
  557.      (QEMS)
  558.  
  559.      scale.0         - 2
  560.      scale.1         - ON|OFF
  561.      scale.2         - line displaying scale line
  562.  
  563. SELect
  564.      Returns the selection level of the focus line and the
  565.      maximum selection level for the file.
  566.      (QES)
  567.  
  568.      select.0        - 2
  569.      select.1        - selection level of focus line
  570.      select.2        - maximum selection level for file
  571.  
  572. SHADow
  573.      Returns the status of the display of shadow lines.
  574.      (QEMS)
  575.  
  576.      shadow.0        - 1
  577.      shadow.1        - ON|OFF
  578.  
  579. SIze
  580.      Returns the number of lines in the current file.
  581.      (QES)
  582.  
  583.      size.0          - 1
  584.      size.1          - Lines in current file.
  585.  
  586. STATUSLine
  587.      The settings for the status line.
  588.      (QEMS)
  589.  
  590.      statusline.0    - 1
  591.      statusline.1    - TOP|BOTTOM|OFF
  592.  
  593. STAY
  594.      Indicates if STAY is on or off.
  595.      (QEMS)
  596.  
  597.      stay.0          - 1
  598.      stay.1          - ON|OFF
  599.  
  600. TABKey
  601.      Returns settings about behaviour of TAB key.
  602.      tabkey.1 is behaviour while in insert mode
  603.      tabkey.2 is behaviour while not in insert mode
  604.      (QEMS)
  605.  
  606.      tabkey.0        - 2
  607.      tabkey.1        - TAB|CHARACTER
  608.      tabkey.2        - TAB|CHARACTER
  609.  
  610. TABLine
  611.      Returns details of TABLine line.
  612.      (QEMS)
  613.  
  614.      tabline.0       - 2
  615.      tabline.1       - ON|OFF
  616.      tabline.2       - line displaying tab line
  617.  
  618. TABS
  619.      Returns settings about tab columns.
  620.      (QEMS)
  621.  
  622.      tabs.0          - 2
  623.      tabs.1          - tab columns
  624.  
  625. TABSIn
  626.      Indicates if TABSIN processing is on or off and the size of the
  627.      tabs setting.
  628.      (QEMS)
  629.  
  630.      tabsin.0        - 2
  631.      tabsin.1        - ON|OFF
  632.      tabsin.2        - size of tabs
  633.  
  634. TABSOut
  635.      Indicates if TABSOUT processing is on or off and the size of the
  636.      tabs setting.
  637.      (QEMS)
  638.  
  639.      tabsout.0       - 2
  640.      tabsout.1       - ON|OFF
  641.      tabsout.2       - size of tabs
  642.  
  643. TERMinal
  644.      Identifies the terminal type currently being used.
  645.      (QES)
  646.  
  647.      terminal.0      - 1
  648.      terminal.1      - DOS|OS2|$TERM value under Unix
  649.  
  650. TOF
  651.      Indicates if the current line is on the *** Top of file *** line.
  652.      (QES)
  653.  
  654.      tof.0           - 1
  655.      tof.1           - ON|OFF
  656.  
  657. Verify
  658.      Returns verify column settings.
  659.      (QEMS)
  660.  
  661.      verify.0        - 1
  662.      verify.1        - Column pair of verify start and end columns.
  663.  
  664. VERShift
  665.      Returns vertical shift value.
  666.      (QES)
  667.  
  668.      vershift.0      - 1
  669.      vershift.1      - VERSHIFT value
  670.  
  671. VERSION
  672.      Returns information about name of application (THE) and version
  673.      information.
  674.      (QES)
  675.  
  676.      version.0       - 4
  677.      version.1       - THE
  678.      version.2       - version string eg. 1.5
  679.      version.3       - platform version (DOS,OS2,UNIX)
  680.      version.4       - version status information eg. beta
  681.  
  682. Width
  683.      Returns maximum line width setting.
  684.      (QES)
  685.  
  686.      width.0         - 1
  687.      width.1         - Maximum line width value.
  688.  
  689. WORDWrap
  690.      Indicates if WORDWARP is on or off.
  691.      (QEMS)
  692.  
  693.      wordwrap.0      - 1
  694.      wordwrap.1      - ON|OFF
  695.  
  696. Zone
  697.      Returns zone column settings.
  698.      (QEMS)
  699.  
  700.      zone.0          - 2
  701.      zone.1          - Zone start column
  702.      zone.2          - Zone end column
  703.  
  704.  
  705.  
  706. ========================================================================
  707. IMPLIED EXTRACT, BOOLEAN and OTHER FUNCTIONS
  708. ========================================================================
  709.  
  710. IMPLIED EXTRACT
  711.  
  712.      The above REXX variables set above by the EXTRACT command may also
  713.      be obtained by a REXX macro as an implied EXTRACT. Each variable
  714.      above that may be set by an explicit EXTRACT command may also be
  715.      used as an external function to REXX to obtain the same information.
  716.      eg. The REXX commands:
  717.  
  718.          'EXTRACT /SIZE/CURLINE/'
  719.          Say size.1 curline.1
  720.  
  721.      may be substituted with:
  722.  
  723.          Say size.1() curline.1()
  724.  
  725. BOOLEAN FUNCTIONS
  726.  
  727.      THE also provides other information to the REXX interpreter via
  728.      boolean functions. These functions return either '1' or '0'
  729.      depending on the information queried.
  730.  
  731.   after()
  732.      Returns '1' if the cursor is currently after the last non-blank
  733.      character on the line, or if the line is blank.
  734.  
  735.   blank()
  736.      Returns '1' if the line the cursor is on is completely blank.
  737.  
  738.   block()
  739.      Returns '1' if the marked block is within the current view.
  740.  
  741.   before()
  742.      Returns '1' if the cursor is currently before the first non-blank
  743.      character on the line, or if the line is blank.
  744.  
  745.   bottomedge()
  746.      Returns '1' if the cursor is on the bottom edge of the filearea
  747.      or prefix area.
  748.  
  749.   command()
  750.      Returns '1' if the command line is on. This is different to
  751.      KEDIT's definition; "Returns '1' if the cursor is on the 
  752.      command line." To get the equivalent KEDIT functionality
  753.      use incommand();
  754.  
  755.   current()
  756.      Returns '1' if the cursor is on the current line.
  757.  
  758.   dir()
  759.      Returns '1' if the current file is the special DIR.DIR file.
  760.  
  761.   end()
  762.      Returns '1' if the cursor is on the last non-blank character on
  763.      the line.
  764.  
  765.   eof()
  766.      Returns '1' if the cursor is on the '*** Bottom of file ***' line
  767.      and the cursor is not on the command line.
  768.  
  769.   first()
  770.      Returns '1' if the cursor is in column 1 of the current window.
  771.  
  772.   focuseof()
  773.      Returns '1' if the focus line is the '*** Bottom of file ***' line
  774.      whether the cursor is on it or not.
  775.  
  776.   focustof()
  777.      Returns '1' if the focus line is the '*** Top of file ***' line
  778.      whether the cursor is on it or not.
  779.  
  780.   inblock()
  781.      Returns '1' if the cursor is in the marked block.
  782.  
  783.   incommand()
  784.      Returns '1' if the cursor is on the command line.
  785.  
  786.   initial()
  787.      Returns '1' if the function is called from the profile file.
  788.  
  789.   inprefix()
  790.      Returns '1' if the cursor is located in the prefix area.
  791.  
  792.   leftedge()
  793.      Returns '1' if the cursor is on the left edge of the file area.
  794.  
  795.   modifiable()
  796.      Returns '1' if the cursor is located in an area that can be changed.
  797.      ie. not on '*** Top of File ***' or '*** Bottom of File ***' lines.
  798.  
  799.   rightedge()
  800.      Returns '1' if the cursor is on the right edge of the file area.
  801.  
  802.   spacechar()
  803.      Returns '1' if the cursor is on a space character.
  804.  
  805.   tof()
  806.      Returns '1' if the cursor is on the '*** Top of file ***' line
  807.      and the cursor is not on the command line.
  808.  
  809.   topedge()
  810.      Returns '1' if the cursor is on the top edge of the file area.
  811.  
  812.   verone()
  813.      Returns '1' if the column 1 of the file is being displayed in
  814.      column 1.
  815.  
  816. OTHER FUNCTIONS
  817.  
  818.    The following functions provide features to simplify THE macros
  819.    written in REXX.
  820.  
  821.   valid_target(target[,anything])
  822.      Returns 'ERROR' if the supplied target is invalid.
  823.      Returns 'NOTFOUND' if the supplied target is valid, but not found.
  824.  
  825.      The first argument is the target to be validated. If a second,
  826.      optional argument is supplied, the target to be validated can
  827.      consist of a target followed by any optional characters. This can
  828.      be useful if the arguments to a macro consist of a target followed
  829.      by another argument. If a valid target is supplied, the remainder
  830.      of the string passed to valid_target() is returned following the
  831.      first line affected and the number of lines to the target.
  832.  
  833.      If a valid target, returns the first line affected by the target
  834.      followed by the number of lines to the target, and optionally the
  835.      remainder of the argument.
  836.      eg. if the focus line is 12 and valid_target() is called as
  837.          result = valid_target(":7") , the return value is "12 -5"
  838.          if the focus line is 12 and valid_target is called as
  839.          result = valid_target(":7 /fred bloggs/",junk), the return
  840.          value is "12 -5 /fred bloggs/"
  841.  
  842. **man-end**********************************************************************/
  843.  
  844. struct query_item
  845.  {
  846.   CHARTYPE query;                                /* valid query response ? */
  847.   CHARTYPE *name;                                          /* name of item */
  848.   short min_len;                       /* minimum length of abbreviation */
  849.   short item_number;                           /* unique number for item */
  850.   short number_values;                      /* number of values returned */
  851.  };
  852. typedef struct query_item QUERY_ITEM;
  853.  
  854. /***********************************************************************/
  855. /* Keep the following items in alphabetic order of name.               */
  856. /***********************************************************************/
  857.  static QUERY_ITEM query_item[] =
  858.   {
  859.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"alt",3,ITEM_ALT,2},
  860.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"arbchar",3,ITEM_ARBCHAR,3},
  861.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"autosave",2,ITEM_AUTOSAVE,1},
  862.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"backup",4,ITEM_BACKUP,1},
  863.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"beep",4,ITEM_BEEP,1},
  864.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"block",5,ITEM_BLOCK,0},
  865.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"case",4,ITEM_CASE,4},
  866.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"clearscreen",6,ITEM_CLEARSCREEN,1},
  867.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"clock",5,ITEM_CLOCK,1},
  868.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"cmdarrows",4,ITEM_CMDARROWS,1},
  869.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"cmdline",3,ITEM_CMDLINE,2},
  870.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"compat",6,ITEM_COMPAT,1},
  871.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"curline",3,ITEM_CURLINE,3},
  872.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"cursor",4,ITEM_CURSOR,8},
  873.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"dirfileid",9,ITEM_DIRFILEID,2},
  874.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"display",4,ITEM_DISPLAY,2},
  875.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"eof",3,ITEM_EOF,1},
  876.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"eolout",3,ITEM_EOLOUT,1},
  877.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"etmode",6,ITEM_ETMODE,1},
  878.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"fname",5,ITEM_FNAME,1},
  879.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"fpath",5,ITEM_FPATH,1},
  880.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"ftype",5,ITEM_FTYPE,1},
  881.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"getenv",6,ITEM_GETENV,1},
  882.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"hex",3,ITEM_HEX,1},
  883.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"hexdisplay",7,ITEM_HEXDISPLAY,1},
  884.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"hexshow",4,ITEM_HEXSHOW,2},
  885.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"idline",2,ITEM_IDLINE,1},
  886.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"impmacro",6,ITEM_IMPMACRO,1},
  887.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"impos",5,ITEM_IMPOS,1},
  888.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"insertmode",6,ITEM_INSERTMODE,1},
  889.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"lastmsg",4,ITEM_LASTMSG,1},
  890.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"lastrc",6,ITEM_LASTRC,1},
  891.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"length",3,ITEM_LENGTH,1},
  892.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"line",2,ITEM_LINE,1},
  893.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"linend",5,ITEM_LINEND,2},
  894.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"macroext",6,ITEM_MACROEXT,1},
  895.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"macropath",6,ITEM_MACROPATH,1},
  896.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"margins",3,ITEM_MARGINS,3},
  897.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"monitor",7,ITEM_MONITOR,2},
  898.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"msgline",4,ITEM_MSGLINE,4},
  899.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"msgmode",4,ITEM_MSGMODE,1},
  900.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"nbfile",3,ITEM_NBFILE,1},
  901.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"newlines",4,ITEM_NEWLINES,1},
  902.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"nondisp",4,ITEM_NONDISP,1},
  903.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"number",3,ITEM_NUMBER,1},
  904.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"pending",4,ITEM_PENDING,4},
  905.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"point",1,ITEM_POINT,1},
  906.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"position",3,ITEM_POSITION,3},
  907.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"prefix",3,ITEM_PREFIX,0},
  908.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"printer",7,ITEM_PRINTER,1},
  909.    {QUERY_READV                                        ,(CHARTYPE *)"readv",5,ITEM_READV,3},
  910.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"reprofile",6,ITEM_REPROFILE,1},
  911.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"reserved",5,ITEM_RESERVED,1},
  912.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"rexxoutput",7,ITEM_REXXOUTPUT,2},
  913.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"scale",4,ITEM_SCALE,2},
  914.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"scope",5,ITEM_SCOPE,1},
  915.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"select",3,ITEM_SELECT,2},
  916.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"shadow",4,ITEM_SHADOW,1},
  917.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"size",2,ITEM_SIZE,1},
  918.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"statusline",7,ITEM_STATUSLINE,1},
  919.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"stay",4,ITEM_STAY,1},
  920.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabkey",4,ITEM_TABKEY,2},
  921.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabline",4,ITEM_TABLINE,2},
  922.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabs",4,ITEM_TABS,1},
  923.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabsin",5,ITEM_TABSIN,2},
  924.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabsout",5,ITEM_TABSOUT,2},
  925.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"terminal",4,ITEM_TERMINAL,1},
  926.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"tof",3,ITEM_TOF,1},
  927.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"verify",1,ITEM_VERIFY,1},
  928.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"vershift",4,ITEM_VERSHIFT,1},
  929.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"version",7,ITEM_VERSION,4},
  930.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"width",1,ITEM_WIDTH,1},
  931.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"wordwrap",5,ITEM_WORDWRAP,1},
  932.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"zone",1,ITEM_ZONE,2},
  933.    {0                                                   ,NULL,0,0,0},
  934.   };
  935. CHARTYPE *block_name[] = {
  936.                           (CHARTYPE *)"",
  937.                           (CHARTYPE *)"LINE",
  938.                           (CHARTYPE *)"BOX",
  939.                           (CHARTYPE *)"STREAM",
  940.                           (CHARTYPE *)"COLUMN",
  941.                           (CHARTYPE *)"WORD"
  942.                          };
  943.  
  944. VALUE item_values[MAX_VARIABLES_RETURNED];
  945. /***********************************************************************/
  946. #ifdef PROTO
  947. short find_item(CHARTYPE *item_name,CHARTYPE query_type)
  948. #else
  949. short find_item(item_name,query_type)
  950. CHARTYPE *item_name;
  951. CHARTYPE query_type;
  952. #endif
  953. /***********************************************************************/
  954. {
  955. /*--------------------------- local data ------------------------------*/
  956.  register short i=0;
  957.  short itemno = (-1);
  958. /*--------------------------- processing ------------------------------*/
  959. #ifdef TRACE
  960.  trace_function("query.c   :find_item");
  961. #endif
  962. /*---------------------------------------------------------------------*/
  963. /* Using the supplied abbreviation for an item, find the entry in the  */
  964. /* query_item[] array. It should return with the index pointer (for    */
  965. /* QUERY_EXTRACT) or an index to the first item in the function_item[] */
  966. /* rexx.c for other query types.                                       */
  967. /*---------------------------------------------------------------------*/
  968.  for (i=0;query_item[i].name != NULL;i++)
  969.     {
  970.      if (equal(query_item[i].name,item_name,query_item[i].min_len)
  971.      && (query_item[i].query & query_type))
  972.        {
  973.         if (query_type == QUERY_EXTRACT)
  974.            itemno = i;
  975.         else
  976.            itemno = query_item[i].item_number;
  977.         break;
  978.        }
  979.     }
  980. #ifdef TRACE
  981.  trace_return();
  982. #endif
  983.  return(itemno);
  984. }
  985. /***********************************************************************/
  986. #ifdef PROTO
  987. short show_status(void)
  988. #else
  989. short show_status()
  990. #endif
  991. /***********************************************************************/
  992. {
  993. #define STATUS_COLS 4
  994. /*-------------------------- external data ----------------------------*/
  995. /*--------------------------- local data ------------------------------*/
  996.  register short i=0,j=0,k=0;
  997.  short lineno=0,colno=0;
  998.  short number_variables=0;
  999.  short item_width=0,column=0,column_width=0,col[STATUS_COLS];
  1000. /*--------------------------- processing ------------------------------*/
  1001. #ifdef TRACE
  1002.  trace_function("query.c   :show_status");
  1003. #endif
  1004. /*---------------------------------------------------------------------*/
  1005. /* For each item that is displayable, display it...                    */
  1006. /*---------------------------------------------------------------------*/
  1007.  column = 0;
  1008.  column_width = COLS / STATUS_COLS;
  1009.  col[0] = 0;
  1010.  for (i=1;i<STATUS_COLS;i++)
  1011.     col[i] = col[i-1]+column_width+1;
  1012.  wclear(stdscr);
  1013.  for (i=0;query_item[i].name != NULL;i++)
  1014.     {
  1015. /*---------------------------------------------------------------------*/
  1016. /* Get only those settings that are queryable...                       */
  1017. /*---------------------------------------------------------------------*/
  1018.      if (query_item[i].query & QUERY_STATUS)
  1019.        {
  1020.         number_variables = get_item_values(query_item[i].item_number,"",QUERY_STATUS,0L,NULL,0L);
  1021.         item_width = 0;
  1022. /*---------------------------------------------------------------------*/
  1023. /* Obtain the total length of the setting values...                    */
  1024. /*---------------------------------------------------------------------*/
  1025.         for (j=0;j<number_variables+1;j++)
  1026.            item_width += item_values[j].len+1;
  1027.         item_width--;     /* reduce by 1 for last value's blank at end */
  1028. /*---------------------------------------------------------------------*/
  1029. /* If the length of the variables is > the screen width, go to next    */
  1030. /* line.                                                               */
  1031. /*---------------------------------------------------------------------*/
  1032.         if (item_width+col[column] > COLS)
  1033.           {
  1034.            column = colno = 0;
  1035.            lineno++;
  1036.           }
  1037.         else
  1038.            colno = col[column];
  1039. /*---------------------------------------------------------------------*/
  1040. /* Display the variables. For the first value, display in BOLD.        */
  1041. /*---------------------------------------------------------------------*/
  1042.         for (j=0;j<number_variables+1;j++)
  1043.           {
  1044.            if (j == 0)
  1045.               attrset(A_BOLD);
  1046.            mvaddstr(lineno,colno,item_values[j].value);
  1047.            attrset(A_NORMAL);
  1048.            colno += item_values[j].len+1;
  1049.           }
  1050.         colno--;
  1051. /*---------------------------------------------------------------------*/
  1052. /* Now have to determine where to display the next set of variables... */
  1053. /* If the just-displayed values go past the last column, or we are     */
  1054. /* already in the last column, go to the next line...                  */
  1055. /*---------------------------------------------------------------------*/
  1056.         if (colno >= col[STATUS_COLS-1] || column == STATUS_COLS-1)
  1057.           {
  1058.            lineno++;
  1059.            column = 0;
  1060.           }
  1061.         else
  1062.           {
  1063. /*---------------------------------------------------------------------*/
  1064. /* ...else if the the just-displayed values go past the 2nd column...  */
  1065. /* If the just-displayed values go past the last column, go on to the  */
  1066. /* next line...                                                        */
  1067. /*---------------------------------------------------------------------*/
  1068.            for (k=0;k<STATUS_COLS;k++)
  1069.               if (colno < col[k])
  1070.                 {
  1071.                  column = k;
  1072.                  break;
  1073.                 }
  1074.           }
  1075.        }
  1076.     }
  1077.  mvaddstr(LINES-2,0,HIT_ANY_KEY);
  1078.  refresh();
  1079.  (void)my_getch(stdscr);
  1080.  wclear(stdscr);
  1081.  refresh();
  1082.  
  1083.  restore_THE();
  1084.  
  1085. #ifdef TRACE
  1086.  trace_return();
  1087. #endif
  1088.  return(RC_OK);
  1089. }
  1090. /***********************************************************************/
  1091. #ifdef PROTO
  1092. short save_status(CHARTYPE *filename)
  1093. #else
  1094. short save_status(filename)
  1095. CHARTYPE *filename;
  1096. #endif
  1097. /***********************************************************************/
  1098. {
  1099. /*-------------------------- external data ----------------------------*/
  1100.  extern CHARTYPE sp_path[MAX_FILE_NAME+1] ;
  1101.  extern CHARTYPE sp_fname[MAX_FILE_NAME+1] ;
  1102.  extern CHARTYPE *the_version;
  1103. /*--------------------------- local data ------------------------------*/
  1104.  register short i=0,j=0;
  1105.  short number_variables=0,rc=RC_OK;
  1106.  FILE *fp=NULL;
  1107. /*--------------------------- processing ------------------------------*/
  1108. #ifdef TRACE
  1109.  trace_function("query.c   :save_status");
  1110. #endif
  1111. /*---------------------------------------------------------------------*/
  1112. /* Get the fully qualified filename from the supplied filename.        */
  1113. /*---------------------------------------------------------------------*/
  1114.  strtrans(filename,OSLASH,ISLASH);
  1115.  if ((rc = splitpath(filename)) != RC_OK)
  1116.    {
  1117.     display_error(10,filename,FALSE);
  1118. #ifdef TRACE
  1119.     trace_return();
  1120. #endif
  1121.     return(rc);
  1122.    }
  1123. /*---------------------------------------------------------------------*/
  1124. /* splitpath() has set up sp_path  and sp_fname. Append the filename.  */
  1125. /*---------------------------------------------------------------------*/
  1126.  strcat(sp_path,sp_fname);
  1127. /*---------------------------------------------------------------------*/
  1128. /* If the file already exists, display an error.                       */
  1129. /*---------------------------------------------------------------------*/
  1130.   if (file_exists(sp_path))
  1131.    {
  1132.     display_error(8,filename,FALSE);
  1133. #ifdef TRACE
  1134.     trace_return();
  1135. #endif
  1136.     return(rc);
  1137.    }
  1138.  fp = fopen(sp_path,"w");
  1139. /*---------------------------------------------------------------------*/
  1140. /* For each item that is modifiable, get its value...                  */
  1141. /*---------------------------------------------------------------------*/
  1142.  fprintf(fp,"/* This file generated by STATUS command of THE %s */\n",the_version);
  1143.  for (i=0;query_item[i].name != NULL;i++)
  1144.     {
  1145. /*---------------------------------------------------------------------*/
  1146. /* Get only those settings that are modifiable...                      */
  1147. /*---------------------------------------------------------------------*/
  1148.      if (query_item[i].query & QUERY_MODIFY)
  1149.        {
  1150.         number_variables = get_item_values(query_item[i].item_number,"",QUERY_MODIFY,0L,NULL,0L);
  1151.         fputs("'set",fp);
  1152. /*---------------------------------------------------------------------*/
  1153. /* Write the variables to the file...                                  */
  1154. /*---------------------------------------------------------------------*/
  1155.         for (j=0;j<number_variables+1;j++)
  1156.           {
  1157.            fputc(' ',fp);
  1158.            fputs(item_values[j].value,fp);
  1159.           }
  1160.         fprintf(fp,"'\n");
  1161.        }
  1162.     }
  1163.  fflush(fp);
  1164.  fclose(fp);
  1165. #ifdef TRACE
  1166.  trace_return();
  1167. #endif
  1168.  return(RC_OK);
  1169. }
  1170. /***********************************************************************/
  1171. #ifdef PROTO
  1172. short set_extract_variables(short itemno)
  1173. #else
  1174. short set_extract_variables(itemno)
  1175. short itemno;
  1176. #endif
  1177. /***********************************************************************/
  1178. {
  1179. /*-------------------------- external data ----------------------------*/
  1180.  extern VALUE item_values[MAX_VARIABLES_RETURNED];
  1181. /*--------------------------- local data ------------------------------*/
  1182.  register short i=0;
  1183.  short rc=RC_OK,number_values=0;
  1184. /*--------------------------- processing ------------------------------*/
  1185. #ifdef TRACE
  1186.  trace_function("rexx.c:    set_extract_variables");
  1187. #endif
  1188.  number_values = atoi(item_values[0].value);
  1189.  for (i=0;i<number_values+1;i++)
  1190.   {
  1191.    if ((rc = set_rexx_variable(query_item[itemno].name,item_values[i].value,i)) != RC_OK)
  1192.       break;
  1193.   } 
  1194.  return(rc);
  1195. }
  1196. /***********************************************************************/
  1197. #ifdef PROTO
  1198. short get_item_values(short itemno,CHARTYPE *itemargs,CHARTYPE query_type,LINETYPE argc,CHARTYPE *arg,LINETYPE arglen)
  1199. #else
  1200. short get_item_values(itemno,itemargs,query_type,argc,arg,arglen)
  1201. short itemno;
  1202. CHARTYPE *itemargs;
  1203. CHARTYPE query_type;
  1204. LINETYPE argc;
  1205. CHARTYPE *arg;
  1206. LINETYPE arglen;
  1207. #endif
  1208. /***********************************************************************/
  1209. {
  1210. /*-------------------------- external data ----------------------------*/
  1211.  extern CHARTYPE term_name[20];
  1212.  extern CHARTYPE dir_path[MAX_FILE_NAME+1];
  1213.  extern CHARTYPE *temp_cmd;
  1214.  extern unsigned short file_start;
  1215.  extern CHARTYPE *the_version;
  1216.  extern CHARTYPE the_macro_path[MAX_FILE_NAME+1];
  1217.  extern CHARTYPE macro_suffix[12];
  1218.  extern CHARTYPE CLEARSCREENx;
  1219.  extern CHARTYPE CMDARROWSTABCMDx;
  1220.  extern bool REPROFILEx;
  1221.  extern bool CAPREXXOUTx;
  1222.  extern LINETYPE CAPREXXMAXx;
  1223.  extern CHARTYPE TABI_ONx;
  1224.  extern CHARTYPE TABI_Nx;
  1225.  extern bool BEEPx;
  1226.  extern bool CLOCKx;
  1227.  extern bool HEXDISPLAYx;
  1228.  extern CHARTYPE number_of_files;
  1229.  extern bool INSERTMODEx;
  1230.  extern CHARTYPE tabkey_insert;
  1231.  extern CHARTYPE tabkey_overwrite;
  1232.  extern short lastrc;
  1233.  extern CHARTYPE last_message[160];
  1234.  extern bool in_profile;
  1235.  extern bool rexx_support;
  1236.  extern unsigned short rec_len;
  1237.  extern unsigned short cmd_rec_len;
  1238.  extern unsigned short pre_rec_len;
  1239.  extern bool colour_support;
  1240.  extern bool ETMODEx;
  1241.  extern bool NONDISPx;
  1242.  extern ROWTYPE STATUSLINEx;
  1243.  extern LINETYPE prefix_current_line;
  1244.  extern bool in_prefix_macro;
  1245.  extern CHARTYPE *cmd_rec;
  1246.  extern CHARTYPE *rec;
  1247.  extern short compatible;
  1248.  extern LINETYPE original_screen_line;
  1249.  extern LINETYPE original_screen_column;
  1250.  extern LINETYPE original_file_line;
  1251.  extern LINETYPE original_file_column;
  1252.  
  1253. #if defined(UNIX) || defined(OS2)
  1254.  extern CHARTYPE *spooler_name;
  1255. #endif
  1256.  extern VIEW_DETAILS *vd_mark;
  1257. /*--------------------------- local data ------------------------------*/
  1258.  static CHARTYPE num0[3];
  1259.  static CHARTYPE num1[10];
  1260.  static CHARTYPE num2[10];
  1261.  static CHARTYPE num3[40];
  1262.  static CHARTYPE num4[40];
  1263.  static CHARTYPE num5[10];
  1264.  static CHARTYPE num6[10];
  1265.  static CHARTYPE num7[10];
  1266.  static CHARTYPE num8[10];
  1267.  static CHARTYPE rsrvd[512];
  1268.  static LINE *curr;
  1269.  static RESERVED *curr_rsrvd;
  1270.  static TARGET target={NULL,0L,0L,NULL,0,0,FALSE};
  1271.  register int i=0;
  1272.  short y=0,x=0;
  1273.  short number_variables = query_item[itemno].number_values;
  1274.  LINETYPE true_line=0L,num_lines=0L;
  1275.  bool bool_flag=FALSE;
  1276.  CHARTYPE cursor_char=0;
  1277.  CHARTYPE *tmpbuf=NULL;
  1278.  CHARTYPE *tarbuf=NULL;     /* only to be used in valid_target section */
  1279.  short target_type=0;
  1280.  short rc=RC_OK;
  1281.  LINETYPE current_screen_line=(-1L);
  1282.  LINETYPE current_screen_column=(-1L);
  1283.  LINETYPE current_file_line=(-1L);
  1284.  LINETYPE current_file_column=(-1L);
  1285.  int key=0;
  1286.  CHARTYPE *keyname=NULL;
  1287. /*--------------------------- processing ------------------------------*/
  1288. #ifdef TRACE
  1289.  trace_function("query.c:   get_item_values");
  1290. #endif
  1291. /*---------------------------------------------------------------------*/
  1292. /* Now that we have a valid item, set up its values...                 */
  1293. /*---------------------------------------------------------------------*/
  1294.  switch(itemno)
  1295.    {
  1296.     case ITEM_AFTER_FUNCTION:
  1297.          getyx(CURRENT_WINDOW,y,x);
  1298.          bool_flag = FALSE;
  1299.          switch(CURRENT_VIEW->current_window)
  1300.            {
  1301.             case WINDOW_MAIN:
  1302.                  if ((x+CURRENT_VIEW->verify_col-1) >= rec_len)
  1303.                     bool_flag = TRUE;
  1304.                  break;
  1305.             case WINDOW_COMMAND:
  1306.                  if (x >= cmd_rec_len)
  1307.                     bool_flag = TRUE;
  1308.                  break;
  1309.             case WINDOW_PREFIX:
  1310.                  if (x >= pre_rec_len)
  1311.                     bool_flag = TRUE;
  1312.                  break;
  1313.            }
  1314.          if (bool_flag)
  1315.            {
  1316.             item_values[1].value = (CHARTYPE *)"1";
  1317.             item_values[1].len = 1;
  1318.            }
  1319.           else
  1320.            {
  1321.             item_values[1].value = (CHARTYPE *)"0";
  1322.             item_values[1].len = 1;
  1323.            }
  1324.          break;
  1325.     case ITEM_ALT:
  1326.          sprintf(num1,"%d",CURRENT_FILE->autosave_alt);
  1327.          sprintf(num2,"%d",CURRENT_FILE->save_alt);
  1328.          item_values[1].value = num1;
  1329.          item_values[2].value = num2;
  1330.          item_values[1].len = strlen(num1);
  1331.          item_values[2].len = strlen(num2);
  1332.          break;
  1333.     case ITEM_ARBCHAR:
  1334.          if (CURRENT_VIEW->arbchar_status)
  1335.            {
  1336.             item_values[1].value = (CHARTYPE *)"ON";
  1337.             item_values[1].len = 2;
  1338.            }
  1339.          else
  1340.            {
  1341.             item_values[1].value = (CHARTYPE *)"OFF";
  1342.             item_values[1].len = 3;
  1343.            }
  1344.          num1[0] = CURRENT_VIEW->arbchar_multiple;
  1345.          num1[1] ='\0';
  1346.          item_values[2].value = num1;
  1347.          item_values[2].len = 1;
  1348.          num2[0] = CURRENT_VIEW->arbchar_single;
  1349.          num2[1] ='\0';
  1350.          item_values[3].value = num2;
  1351.          item_values[3].len = 1;
  1352.          break;
  1353.     case ITEM_AUTOSAVE:
  1354.          sprintf(num1,"%d",CURRENT_FILE->autosave);
  1355.          item_values[1].value = num1;
  1356.          item_values[1].len = strlen(num1);
  1357.          if (CURRENT_FILE->autosave == 0)
  1358.            {
  1359.             item_values[1].value = (CHARTYPE *)"OFF";
  1360.             item_values[1].len = 3;
  1361.            }
  1362.          break;
  1363.     case ITEM_BACKUP:
  1364.          switch(CURRENT_FILE->backup)
  1365.            {
  1366.             case BACKUP_OFF:
  1367.                  item_values[1].value = (CHARTYPE *)"OFF";
  1368.                  break;
  1369.             case BACKUP_TEMP:
  1370.                  item_values[1].value = (CHARTYPE *)"TEMP";
  1371.                  break;
  1372.             case BACKUP_KEEP:
  1373.                  item_values[1].value = (CHARTYPE *)"KEEP";
  1374.                  break;
  1375.            }
  1376.          item_values[1].len = strlen(item_values[1].value);
  1377.          break;
  1378.     case ITEM_BEFORE_FUNCTION:
  1379.          getyx(CURRENT_WINDOW,y,x);
  1380.          bool_flag = FALSE;
  1381.          switch(CURRENT_VIEW->current_window)
  1382.            {
  1383.             case WINDOW_MAIN:
  1384.                  if ((x+CURRENT_VIEW->verify_col-1) < memne(rec,' ',rec_len))
  1385.                     bool_flag = TRUE;
  1386.                  break;
  1387.             case WINDOW_COMMAND:
  1388.                  if (x < memne(cmd_rec,' ',cmd_rec_len))
  1389.                     bool_flag = TRUE;
  1390.                  break;
  1391.             case WINDOW_PREFIX:/* cursor can't go before 1st non-blank */
  1392.                  break;
  1393.            }
  1394.          if (bool_flag)
  1395.            {
  1396.             item_values[1].value = (CHARTYPE *)"1";
  1397.             item_values[1].len = 1;
  1398.            }
  1399.           else
  1400.            {
  1401.             item_values[1].value = (CHARTYPE *)"0";
  1402.             item_values[1].len = 1;
  1403.            }
  1404.          break;
  1405.     case ITEM_BEEP:
  1406.          if (BEEPx)
  1407.            {
  1408.             item_values[1].value = (CHARTYPE *)"ON";
  1409.             item_values[1].len = 2;
  1410.            }
  1411.           else
  1412.            {
  1413.             item_values[1].value = (CHARTYPE *)"OFF";
  1414.             item_values[1].len = 3;
  1415.            }
  1416.          break;
  1417.     case ITEM_BLANK_FUNCTION:
  1418.          bool_flag = FALSE;
  1419.          switch(CURRENT_VIEW->current_window)
  1420.            {
  1421.             case WINDOW_MAIN:
  1422.                  if (rec_len == 0)
  1423.                     bool_flag = TRUE;
  1424.                  break;
  1425.             case WINDOW_PREFIX:
  1426.                  if (pre_rec_len == 0)
  1427.                     bool_flag = TRUE;
  1428.                  break;
  1429.             case WINDOW_COMMAND:
  1430.                  if (cmd_rec_len == 0)
  1431.                     bool_flag = TRUE;
  1432.                  break;
  1433.            }
  1434.          if (bool_flag)
  1435.            {
  1436.             item_values[1].value = (CHARTYPE *)"1";
  1437.             item_values[1].len = 1;
  1438.            }
  1439.           else
  1440.            {
  1441.             item_values[1].value = (CHARTYPE *)"0";
  1442.             item_values[1].len = 1;
  1443.            }
  1444.          break;
  1445.     case ITEM_BLOCK:
  1446.          if (MARK_VIEW == NULL)
  1447.            {
  1448.             item_values[1].value = (CHARTYPE *)"NONE";
  1449.             item_values[1].len = 4;
  1450.             number_variables = 1;
  1451.            }
  1452.           else
  1453.            {
  1454.             number_variables = 6;
  1455.             item_values[1].value = block_name[MARK_VIEW->mark_type];
  1456.             item_values[1].len = strlen(item_values[1].value);
  1457.             sprintf(num1,"%d",MARK_VIEW->mark_start_line);
  1458.             item_values[2].value = num1;
  1459.             item_values[2].len = strlen(num1);
  1460.             sprintf(num2,"%d",MARK_VIEW->mark_start_col);
  1461.             item_values[3].value = num2;
  1462.             item_values[3].len = strlen(num2);
  1463.             sprintf(num3,"%d",MARK_VIEW->mark_end_line);
  1464.             item_values[4].value = num3;
  1465.             item_values[4].len = strlen(num3);
  1466.             sprintf(num4,"%d",MARK_VIEW->mark_end_col);
  1467.             item_values[5].value = num4;
  1468.             item_values[5].len = strlen(num4);
  1469.             strcpy(temp_cmd,MARK_FILE->fpath);
  1470.             strcat(temp_cmd,MARK_FILE->fname);
  1471.             item_values[6].value = (CHARTYPE *)temp_cmd;
  1472.             item_values[6].len = strlen(temp_cmd);
  1473.            }
  1474.          break;
  1475.     case ITEM_BLOCK_FUNCTION:
  1476.          if (CURRENT_VIEW == MARK_VIEW)
  1477.            {
  1478.             item_values[1].value = (CHARTYPE *)"1";
  1479.             item_values[1].len = 1;
  1480.            }
  1481.           else
  1482.            {
  1483.             item_values[1].value = (CHARTYPE *)"0";
  1484.             item_values[1].len = 1;
  1485.            }
  1486.          break;
  1487.     case ITEM_BOTTOMEDGE_FUNCTION:
  1488.          getyx(CURRENT_WINDOW,y,x);
  1489.          if (CURRENT_VIEW->current_window == WINDOW_MAIN
  1490.          &&  y == CURRENT_SCREEN.rows[WINDOW_MAIN]-1)
  1491.            {
  1492.             item_values[1].value = (CHARTYPE *)"1";
  1493.             item_values[1].len = 1;
  1494.            }
  1495.           else
  1496.            {
  1497.             item_values[1].value = (CHARTYPE *)"0";
  1498.             item_values[1].len = 1;
  1499.            }
  1500.          break;
  1501.     case ITEM_CASE:
  1502.          switch(CURRENT_VIEW->case_enter)
  1503.            {
  1504.             case CASE_MIXED:
  1505.                  item_values[1].value = (CHARTYPE *)"MIXED";
  1506.                  break;
  1507.             case CASE_UPPER:
  1508.                  item_values[1].value = (CHARTYPE *)"UPPER";
  1509.                  break;
  1510.             case CASE_LOWER:
  1511.                  item_values[1].value = (CHARTYPE *)"LOWER";
  1512.                  break;
  1513.             default:
  1514.                  break;
  1515.            }
  1516.          item_values[1].len = 5;
  1517.          switch(CURRENT_VIEW->case_locate)
  1518.            {
  1519.             case CASE_IGNORE:
  1520.                  item_values[2].value = (CHARTYPE *)"IGNORE";
  1521.                  item_values[2].len = 6;
  1522.                  break;
  1523.             case CASE_RESPECT:
  1524.                  item_values[2].value = (CHARTYPE *)"RESPECT";
  1525.                  item_values[2].len = 7;
  1526.                  break;
  1527.             default:
  1528.                  break;
  1529.            }
  1530.          switch(CURRENT_VIEW->case_change)
  1531.            {
  1532.             case CASE_IGNORE:
  1533.                  item_values[3].value = (CHARTYPE *)"IGNORE";
  1534.                  item_values[3].len = 6;
  1535.                  break;
  1536.             case CASE_RESPECT:
  1537.                  item_values[3].value = (CHARTYPE *)"RESPECT";
  1538.                  item_values[3].len = 7;
  1539.                  break;
  1540.             default:
  1541.                  break;
  1542.            }
  1543.          switch(CURRENT_VIEW->case_sort)
  1544.            {
  1545.             case CASE_IGNORE:
  1546.                  item_values[4].value = (CHARTYPE *)"IGNORE";
  1547.                  item_values[4].len = 6;
  1548.                  break;
  1549.             case CASE_RESPECT:
  1550.                  item_values[4].value = (CHARTYPE *)"RESPECT";
  1551.                  item_values[4].len = 7;
  1552.                  break;
  1553.             default:
  1554.                  break;
  1555.            }
  1556.          break;
  1557.     case ITEM_CLEARSCREEN:
  1558.          if (CLEARSCREENx)
  1559.            {
  1560.             item_values[1].value = (CHARTYPE *)"ON";
  1561.             item_values[1].len = 2;
  1562.            }
  1563.           else
  1564.            {
  1565.             item_values[1].value = (CHARTYPE *)"OFF";
  1566.             item_values[1].len = 3;
  1567.            }
  1568.          break;
  1569.     case ITEM_CLOCK:
  1570.          if (CLOCKx)
  1571.            {
  1572.             item_values[1].value = (CHARTYPE *)"ON";
  1573.             item_values[1].len = 2;
  1574.            }
  1575.           else
  1576.            {
  1577.             item_values[1].value = (CHARTYPE *)"OFF";
  1578.             item_values[1].len = 3;
  1579.            }
  1580.          break;
  1581.     case ITEM_COMMAND_FUNCTION:
  1582.          if (CURRENT_WINDOW_COMMAND != NULL)
  1583.            {
  1584.             item_values[1].value = (CHARTYPE *)"1";
  1585.             item_values[1].len = 1;
  1586.            }
  1587.           else
  1588.            {
  1589.             item_values[1].value = (CHARTYPE *)"0";
  1590.             item_values[1].len = 1;
  1591.            }
  1592.          break;
  1593.     case ITEM_CMDARROWS:
  1594.          if (CMDARROWSTABCMDx)
  1595.            {
  1596.             item_values[1].value = (CHARTYPE *)"TAB";
  1597.             item_values[1].len = 3;
  1598.            }
  1599.           else
  1600.            {
  1601.             item_values[1].value = (CHARTYPE *)"RETRIEVE";
  1602.             item_values[1].len = 8;
  1603.            }
  1604.          break;
  1605.     case ITEM_CMDLINE:
  1606.          switch(CURRENT_VIEW->cmd_line)
  1607.            {
  1608.             case 'B':
  1609.                  item_values[1].value = (CHARTYPE *)"BOTTOM";
  1610.                  item_values[1].len = 6;
  1611.                  break;
  1612.             case 'T':
  1613.                  item_values[1].value = (CHARTYPE *)"TOP";
  1614.                  item_values[1].len = 3;
  1615.                  break;
  1616.             case 'O':
  1617.                  item_values[1].value = (CHARTYPE *)"OFF";
  1618.                  item_values[1].len = 3;
  1619.                  number_variables = 1;
  1620.                  break;
  1621.            }
  1622.          if (CURRENT_VIEW->cmd_line == 'O')
  1623.             break;
  1624.          if (query_type == QUERY_EXTRACT
  1625.          ||  query_type == QUERY_FUNCTION)
  1626.            {
  1627.             sprintf(num1,"%d",CURRENT_SCREEN.start_row[WINDOW_COMMAND]+1);
  1628.             item_values[2].value = num1;
  1629.             item_values[2].len = strlen(num1);
  1630.             item_values[3].value = cmd_rec;
  1631.             item_values[3].len = cmd_rec_len;
  1632.             number_variables = 3;
  1633.            }
  1634.          else
  1635.             number_variables = 1;
  1636.          break;
  1637.     case ITEM_COMPAT:
  1638.          switch(compatible)
  1639.            {
  1640.             case COMPAT_THE:
  1641.                  item_values[1].value = (CHARTYPE *)"THE";
  1642.                  item_values[1].len = 3;
  1643.                  break;
  1644.             case COMPAT_XEDIT:
  1645.                  item_values[1].value = (CHARTYPE *)"XEDIT";
  1646.                  item_values[1].len = 5;
  1647.                  break;
  1648.             case COMPAT_KEDIT:
  1649.                  item_values[1].value = (CHARTYPE *)"KEDIT";
  1650.                  item_values[1].len = 5;
  1651.                  break;
  1652.            }
  1653.          break;
  1654.     case ITEM_CURLINE:
  1655.          if (CURRENT_VIEW->current_base == POSITION_MIDDLE)
  1656.             sprintf(rsrvd,"M%+d",CURRENT_VIEW->current_off);
  1657.          else
  1658.             sprintf(rsrvd,"%d",CURRENT_VIEW->current_off);
  1659.          item_values[1].value = rsrvd;
  1660.          item_values[1].len = strlen(rsrvd);
  1661.          if (query_type == QUERY_EXTRACT
  1662.          ||  query_type == QUERY_FUNCTION)
  1663.            {
  1664.             sprintf(num1,"%d",CURRENT_VIEW->current_row+1);
  1665.             item_values[2].value = num1;
  1666.             item_values[2].len = strlen(num1);
  1667.             curr = lll_find(CURRENT_FILE->first_line,get_true_line());
  1668.             item_values[3].value = (CHARTYPE *)curr->line;
  1669.             item_values[3].len = curr->length;
  1670.            }
  1671.          else
  1672.             number_variables = 1;
  1673.          break;
  1674.     case ITEM_CURSOR:
  1675.          get_cursor_position(¤t_screen_line,¤t_screen_column,
  1676.                              ¤t_file_line,¤t_file_column);
  1677.          sprintf(num1,"%d",current_screen_line);
  1678.          item_values[1].value = num1;
  1679.          item_values[1].len = strlen(num1);
  1680.          sprintf(num2,"%d",current_screen_column);
  1681.          item_values[2].value = num2;
  1682.          item_values[2].len = strlen(num2);
  1683.          sprintf(num3,"%d",current_file_line);
  1684.          item_values[3].value = num3;
  1685.          item_values[3].len = strlen(num3);
  1686.          sprintf(num4,"%d",current_file_column);
  1687.          item_values[4].value = num4;
  1688.          item_values[4].len = strlen(num4);
  1689.          sprintf(num5,"%d",original_screen_line);
  1690.          item_values[5].value = num5;
  1691.          item_values[5].len = strlen(num5);
  1692.          sprintf(num6,"%d",original_screen_column);
  1693.          item_values[6].value = num6;
  1694.          item_values[6].len = strlen(num6);
  1695.          sprintf(num7,"%d",original_file_line);
  1696.          item_values[7].value = num7;
  1697.          item_values[7].len = strlen(num7);
  1698.          sprintf(num8,"%d",original_file_column);
  1699.          item_values[8].value = num8;
  1700.          item_values[8].len = strlen(num8);
  1701.          break;
  1702.     case ITEM_CURRENT_FUNCTION:
  1703.          if (CURRENT_VIEW->current_window != WINDOW_COMMAND
  1704.          &&  CURRENT_VIEW->focus_line == CURRENT_VIEW->current_line)
  1705.            {
  1706.             item_values[1].value = (CHARTYPE *)"1";
  1707.             item_values[1].len = 1;
  1708.            }
  1709.           else
  1710.            {
  1711.             item_values[1].value = (CHARTYPE *)"0";
  1712.             item_values[1].len = 1;
  1713.            }
  1714.          break;
  1715.     case ITEM_DIR_FUNCTION:
  1716.          if (CURRENT_FILE->pseudo_file == PSEUDO_DIR)
  1717.            {
  1718.             item_values[1].value = (CHARTYPE *)"1";
  1719.             item_values[1].len = 1;
  1720.            }
  1721.          else
  1722.            {
  1723.             item_values[1].value = (CHARTYPE *)"0";
  1724.             item_values[1].len = 1;
  1725.            }
  1726.          break;
  1727.     case ITEM_DIRFILEID:
  1728.          true_line = (-1L);
  1729.          if (CURRENT_FILE->pseudo_file == PSEUDO_DIR)
  1730.            {
  1731.             if (CURRENT_VIEW->current_window == WINDOW_COMMAND)
  1732.                if (CURRENT_TOF || CURRENT_BOF)
  1733.                   true_line = (-1L);
  1734.                else
  1735.                   true_line = CURRENT_VIEW->current_line;
  1736.             else
  1737.                if (FOCUS_TOF || FOCUS_BOF)
  1738.                   true_line = (-1L);
  1739.                else
  1740.                   true_line = CURRENT_VIEW->focus_line;
  1741.            }
  1742.          if (true_line == (-1L))
  1743.            {
  1744.             item_values[1].value = (CHARTYPE *)"";
  1745.             item_values[1].len = 0;
  1746.             item_values[2].value = (CHARTYPE *)"";
  1747.             item_values[2].len = 0;
  1748.            }
  1749.          else
  1750.            {
  1751.             curr = lll_find(CURRENT_FILE->first_line,true_line);
  1752.             item_values[1].value = (CHARTYPE *)dir_path;
  1753.             item_values[1].len = strlen(dir_path);
  1754.             if (curr->length < file_start)
  1755.               {
  1756.                item_values[2].value = (CHARTYPE *)"";
  1757.                item_values[2].len = 0;
  1758.               }
  1759.             else
  1760.               {
  1761.                item_values[2].value = (CHARTYPE *)curr->line+file_start;
  1762.                item_values[2].len = strlen(curr->line+file_start);
  1763.               }
  1764.            }
  1765.          break;
  1766.     case ITEM_END_FUNCTION:
  1767.          getyx(CURRENT_WINDOW,y,x);
  1768.          if (CURRENT_VIEW->current_window == WINDOW_MAIN
  1769.          &&  (x+CURRENT_VIEW->verify_col) == rec_len)
  1770.            {
  1771.             item_values[1].value = (CHARTYPE *)"1";
  1772.             item_values[1].len = 1;
  1773.            }
  1774.           else
  1775.            {
  1776.             item_values[1].value = (CHARTYPE *)"0";
  1777.             item_values[1].len = 1;
  1778.            }
  1779.          break;
  1780.     case ITEM_DISPLAY:
  1781.          sprintf(num1,"%d",CURRENT_VIEW->display_low);
  1782.          item_values[1].value = num1;
  1783.          item_values[1].len = strlen(num1);
  1784.          sprintf(num2,"%d",CURRENT_VIEW->display_high);
  1785.          item_values[2].value = num2;
  1786.          item_values[2].len = strlen(num2);
  1787.          break;
  1788.     case ITEM_EOF:
  1789.          if (CURRENT_BOF)
  1790.            {
  1791.             item_values[1].value = (CHARTYPE *)"ON";
  1792.             item_values[1].len = 2;
  1793.            }
  1794.           else
  1795.            {
  1796.             item_values[1].value = (CHARTYPE *)"OFF";
  1797.             item_values[1].len = 3;
  1798.            }
  1799.          break;
  1800.     case ITEM_EOF_FUNCTION:
  1801.          if (FOCUS_BOF && CURRENT_VIEW->current_window != WINDOW_COMMAND)
  1802.            {
  1803.             item_values[1].value = (CHARTYPE *)"1";
  1804.             item_values[1].len = 1;
  1805.            }
  1806.           else
  1807.            {
  1808.             item_values[1].value = (CHARTYPE *)"0";
  1809.             item_values[1].len = 1;
  1810.            }
  1811.          break;
  1812.     case ITEM_EOLOUT:
  1813.          if (CURRENT_FILE->eolout == EOLOUT_LF)
  1814.            {
  1815.             item_values[1].value = (CHARTYPE *)"LF";
  1816.             item_values[1].len = 2;
  1817.            }
  1818.           else
  1819.            {
  1820.             item_values[1].value = (CHARTYPE *)"CRLF";
  1821.             item_values[1].len = 4;
  1822.            }
  1823.          break;
  1824.     case ITEM_ETMODE:
  1825.          if (ETMODEx)
  1826.            {
  1827.             item_values[1].value = (CHARTYPE *)"ON";
  1828.             item_values[1].len = 2;
  1829.            }
  1830.           else
  1831.            {
  1832.             item_values[1].value = (CHARTYPE *)"OFF";
  1833.             item_values[1].len = 3;
  1834.            }
  1835.          break;
  1836.     case ITEM_FIRST_FUNCTION:
  1837.          getyx(CURRENT_WINDOW,y,x);
  1838.          if (x == 0)
  1839.            {
  1840.             item_values[1].value = (CHARTYPE *)"1";
  1841.             item_values[1].len = 1;
  1842.            }
  1843.          else
  1844.            {
  1845.             item_values[1].value = (CHARTYPE *)"0";
  1846.             item_values[1].len = 1;
  1847.            }
  1848.          break;
  1849.     case ITEM_FOCUSEOF_FUNCTION:
  1850.          if (FOCUS_BOF)
  1851.            {
  1852.             item_values[1].value = (CHARTYPE *)"1";
  1853.             item_values[1].len = 1;
  1854.            }
  1855.          else
  1856.            {
  1857.             item_values[1].value = (CHARTYPE *)"0";
  1858.             item_values[1].len = 1;
  1859.            }
  1860.          break;
  1861.     case ITEM_FOCUSTOF_FUNCTION:
  1862.          if (FOCUS_TOF)
  1863.            {
  1864.             item_values[1].value = (CHARTYPE *)"1";
  1865.             item_values[1].len = 1;
  1866.            }
  1867.          else
  1868.            {
  1869.             item_values[1].value = (CHARTYPE *)"0";
  1870.             item_values[1].len = 1;
  1871.            }
  1872.          break;
  1873.     case ITEM_FNAME:
  1874.          item_values[1].value = (CHARTYPE *)CURRENT_FILE->fname;
  1875.          item_values[1].len = strlen(CURRENT_FILE->fname);
  1876.          break;
  1877.     case ITEM_FPATH:
  1878.          item_values[1].value = (CHARTYPE *)CURRENT_FILE->fpath;
  1879.          item_values[1].len = strlen(CURRENT_FILE->fpath);
  1880.          break;
  1881.     case ITEM_FTYPE:
  1882.          x = strzreveq(CURRENT_FILE->fname,'.');
  1883.          if (x == (-1))
  1884.            {
  1885.             item_values[1].value = (CHARTYPE *)"";
  1886.             item_values[1].len = 0;
  1887.            }
  1888.          else
  1889.            {
  1890.             item_values[1].value = (CHARTYPE *)CURRENT_FILE->fname+x+1;
  1891.             item_values[1].len = strlen(CURRENT_FILE->fname+x+1);
  1892.            }
  1893.          break;
  1894.     case ITEM_GETENV:
  1895.          if (query_type == QUERY_FUNCTION)
  1896.             tmpbuf = (CHARTYPE *)getenv(arg);
  1897.          else
  1898.             tmpbuf = (CHARTYPE *)getenv(itemargs);
  1899.          if (tmpbuf == NULL)
  1900.             item_values[1].value = (CHARTYPE *)"***invalid***";
  1901.          else
  1902.             item_values[1].value = tmpbuf;
  1903.          item_values[1].len = strlen(item_values[1].value);
  1904.          break;
  1905.     case ITEM_HEX:
  1906.          if (CURRENT_VIEW->hex)
  1907.            {
  1908.             item_values[1].value = (CHARTYPE *)"ON";
  1909.             item_values[1].len = 2;
  1910.            }
  1911.           else
  1912.            {
  1913.             item_values[1].value = (CHARTYPE *)"OFF";
  1914.             item_values[1].len = 3;
  1915.            }
  1916.          break;
  1917.     case ITEM_HEXDISPLAY:
  1918.          if (HEXDISPLAYx)
  1919.            {
  1920.             item_values[1].value = (CHARTYPE *)"ON";
  1921.             item_values[1].len = 2;
  1922.            }
  1923.           else
  1924.            {
  1925.             item_values[1].value = (CHARTYPE *)"OFF";
  1926.             item_values[1].len = 3;
  1927.            }
  1928.          break;
  1929.     case ITEM_HEXSHOW:
  1930.          if (CURRENT_VIEW->hexshow_on)
  1931.            {
  1932.             item_values[1].value = (CHARTYPE *)"ON";
  1933.             item_values[1].len = 2;
  1934.            }
  1935.           else
  1936.            {
  1937.             item_values[1].value = (CHARTYPE *)"OFF";
  1938.             item_values[1].len = 3;
  1939.            }
  1940.          if (CURRENT_VIEW->hexshow_base == POSITION_MIDDLE)
  1941.             sprintf(rsrvd,"M%+d",CURRENT_VIEW->hexshow_off);
  1942.          else
  1943.             sprintf(rsrvd,"%d",CURRENT_VIEW->hexshow_off);
  1944.          item_values[2].value = rsrvd;
  1945.          item_values[2].len = strlen(rsrvd);
  1946.          break;
  1947.     case ITEM_IDLINE:
  1948.          if (CURRENT_VIEW->id_line)
  1949.            {
  1950.             item_values[1].value = (CHARTYPE *)"ON";
  1951.             item_values[1].len = 2;
  1952.            }
  1953.           else
  1954.            {
  1955.             item_values[1].value = (CHARTYPE *)"OFF";
  1956.             item_values[1].len = 3;
  1957.            }
  1958.          break;
  1959.     case ITEM_IMPMACRO:
  1960.          if (CURRENT_VIEW->imp_macro)
  1961.            {
  1962.             item_values[1].value = (CHARTYPE *)"ON";
  1963.             item_values[1].len = 2;
  1964.            }
  1965.           else
  1966.            {
  1967.             item_values[1].value = (CHARTYPE *)"OFF";
  1968.             item_values[1].len = 3;
  1969.            }
  1970.          break;
  1971.     case ITEM_IMPOS:
  1972.          if (CURRENT_VIEW->imp_os)
  1973.            {
  1974.             item_values[1].value = (CHARTYPE *)"ON";
  1975.             item_values[1].len = 2;
  1976.            }
  1977.           else
  1978.            {
  1979.             item_values[1].value = (CHARTYPE *)"OFF";
  1980.             item_values[1].len = 3;
  1981.            }
  1982.          break;
  1983.     case ITEM_INBLOCK_FUNCTION:
  1984.          bool_flag = FALSE;
  1985.          if (CURRENT_VIEW == MARK_VIEW
  1986.          &&  CURRENT_VIEW->current_window == WINDOW_MAIN)
  1987.            {
  1988.             getyx(CURRENT_WINDOW_MAIN,y,x);
  1989.             switch(MARK_VIEW->mark_type)
  1990.               {
  1991.                case M_LINE:
  1992.                     if ((CURRENT_VIEW->focus_line >= MARK_VIEW->mark_start_line)
  1993.                     &&  (CURRENT_VIEW->focus_line <= MARK_VIEW->mark_end_line))
  1994.                       bool_flag = TRUE;
  1995.                     break;
  1996.                case M_BOX:
  1997.                     if ((CURRENT_VIEW->focus_line >= MARK_VIEW->mark_start_line)
  1998.                     &&  (CURRENT_VIEW->focus_line <= MARK_VIEW->mark_end_line)
  1999.                     &&  (x + CURRENT_VIEW->verify_start >= MARK_VIEW->mark_start_col)
  2000.                     &&  (x + CURRENT_VIEW->verify_start <= MARK_VIEW->mark_end_col))
  2001.                       bool_flag = TRUE;
  2002.                     break;
  2003.                default:
  2004.                     break;
  2005.               }
  2006.            }
  2007.          if (bool_flag)
  2008.            {
  2009.             item_values[1].value = (CHARTYPE *)"1";
  2010.             item_values[1].len = 1;
  2011.            }
  2012.           else
  2013.            {
  2014.             item_values[1].value = (CHARTYPE *)"0";
  2015.             item_values[1].len = 1;
  2016.            }
  2017.          break;
  2018.     case ITEM_INCOMMAND_FUNCTION:
  2019.          if (CURRENT_VIEW->current_window == WINDOW_COMMAND)
  2020.            {
  2021.             item_values[1].value = (CHARTYPE *)"1";
  2022.             item_values[1].len = 1;
  2023.            }
  2024.           else
  2025.            {
  2026.             item_values[1].value = (CHARTYPE *)"0";
  2027.             item_values[1].len = 1;
  2028.            }
  2029.          break;
  2030.     case ITEM_INITIAL_FUNCTION:
  2031.          if (in_profile)
  2032.            {
  2033.             item_values[1].value = (CHARTYPE *)"1";
  2034.             item_values[1].len = 1;
  2035.            }
  2036.           else
  2037.            {
  2038.             item_values[1].value = (CHARTYPE *)"0";
  2039.             item_values[1].len = 1;
  2040.            }
  2041.          break;
  2042.     case ITEM_INPREFIX_FUNCTION:
  2043.          if (CURRENT_VIEW->current_window == WINDOW_PREFIX)
  2044.            {
  2045.             item_values[1].value = (CHARTYPE *)"1";
  2046.             item_values[1].len = 1;
  2047.            }
  2048.           else
  2049.            {
  2050.             item_values[1].value = (CHARTYPE *)"0";
  2051.             item_values[1].len = 1;
  2052.            }
  2053.          break;
  2054.     case ITEM_INSERTMODE:
  2055.          if (INSERTMODEx)
  2056.            {
  2057.             item_values[1].value = (CHARTYPE *)"ON";
  2058.             item_values[1].len = 2;
  2059.            }
  2060.           else
  2061.            {
  2062.             item_values[1].value = (CHARTYPE *)"OFF";
  2063.             item_values[1].len = 3;
  2064.            }
  2065.          break;
  2066.     case ITEM_LASTMSG:
  2067.          item_values[1].value = (CHARTYPE *)last_message;
  2068.          item_values[1].len = strlen(last_message);
  2069.          break;
  2070.     case ITEM_LASTRC:
  2071.          sprintf(num1,"%d",lastrc);
  2072.          item_values[1].value = num1;
  2073.          item_values[1].len = strlen(num1);
  2074.          break;
  2075.     case ITEM_LEFTEDGE_FUNCTION:
  2076.          getyx(CURRENT_WINDOW,y,x);
  2077.          if (CURRENT_VIEW->current_window == WINDOW_MAIN
  2078.          &&  x == 0)
  2079.            {
  2080.             item_values[1].value = (CHARTYPE *)"1";
  2081.             item_values[1].len = 1;
  2082.            }
  2083.           else
  2084.            {
  2085.             item_values[1].value = (CHARTYPE *)"0";
  2086.             item_values[1].len = 1;
  2087.            }
  2088.          break;
  2089.     case ITEM_LENGTH:
  2090.          curr = lll_find(CURRENT_FILE->first_line,CURRENT_VIEW->current_line);
  2091.          sprintf(num1,"%d",curr->length);
  2092.          item_values[1].value = num1;
  2093.          item_values[1].len = strlen(num1);
  2094.          break;
  2095.     case ITEM_LINE:
  2096.          sprintf(num1,"%d",get_true_line());
  2097.          item_values[1].value = num1;
  2098.          item_values[1].len = strlen(num1);
  2099.          break;
  2100.     case ITEM_LINEND:
  2101.          if (CURRENT_VIEW->linend_status)
  2102.            {
  2103.             item_values[1].value = (CHARTYPE *)"ON";
  2104.             item_values[1].len = 2;
  2105.            }
  2106.           else
  2107.            {
  2108.             item_values[1].value = (CHARTYPE *)"OFF";
  2109.             item_values[1].len = 3;
  2110.            }
  2111.          num1[0] = CURRENT_VIEW->linend_value;
  2112.          num1[1] = '\0';
  2113.          item_values[2].value = num1;
  2114.          item_values[2].len = 1;
  2115.          break;
  2116.     case ITEM_MACROEXT:
  2117.          if (strlen(macro_suffix) == 0)
  2118.             item_values[1].value = (CHARTYPE *)macro_suffix;
  2119.          else
  2120.             item_values[1].value = (CHARTYPE *)macro_suffix+1;
  2121.          item_values[1].len = strlen(macro_suffix);
  2122.          break;
  2123.     case ITEM_MACROPATH:
  2124.          item_values[1].value = (CHARTYPE *)the_macro_path;
  2125.          item_values[1].len = strlen(the_macro_path);
  2126.          break;
  2127.     case ITEM_MARGINS:
  2128.          sprintf(num1,"%d",CURRENT_VIEW->margin_left);
  2129.          item_values[1].value = num1;
  2130.          item_values[1].len = strlen(num1);
  2131.          sprintf(num2,"%d",CURRENT_VIEW->margin_right);
  2132.          item_values[2].value = num2;
  2133.          item_values[2].len = strlen(num2);
  2134.          if (CURRENT_VIEW->margin_indent_offset)
  2135.             sprintf(num3,"%+d",CURRENT_VIEW->margin_indent);
  2136.          else
  2137.             sprintf(num3,"%d",CURRENT_VIEW->margin_indent);
  2138.          item_values[3].value = num3;
  2139.          item_values[3].len = strlen(num3);
  2140.          break;
  2141.     case ITEM_MODIFIABLE_FUNCTION:
  2142.          switch(CURRENT_VIEW->current_window)
  2143.            {
  2144.             case WINDOW_MAIN:
  2145.                  getyx(CURRENT_WINDOW,y,x);
  2146.                  if (FOCUS_TOF 
  2147.                  ||  FOCUS_BOF
  2148.                  ||  CURRENT_SCREEN.sl[y].line_type == LINE_SHADOW)
  2149.                     bool_flag = FALSE;
  2150.                  else
  2151.                     bool_flag = TRUE;
  2152.                  break;
  2153.             default:
  2154.                  bool_flag = TRUE;
  2155.                  break;
  2156.            }
  2157.          if (bool_flag)
  2158.            {
  2159.             item_values[1].value = (CHARTYPE *)"1";
  2160.             item_values[1].len = 1;
  2161.            }
  2162.           else
  2163.            {
  2164.             item_values[1].value = (CHARTYPE *)"0";
  2165.             item_values[1].len = 1;
  2166.            }
  2167.          break;
  2168.     case ITEM_MONITOR:
  2169. #ifdef A_COLOR
  2170.          if (colour_support)
  2171.            {
  2172.             item_values[1].value = (CHARTYPE *)"COLOR";
  2173.             item_values[1].len = 5;
  2174.            }
  2175.           else
  2176.            {
  2177.             item_values[1].value = (CHARTYPE *)"MONO";
  2178.             item_values[1].len = 4;
  2179.            }
  2180.           item_values[2].value = (CHARTYPE *)"COLOR";
  2181.           item_values[2].len = 5;
  2182.           break;
  2183. #else
  2184.           item_values[1].value = (CHARTYPE *)"MONO";
  2185.           item_values[1].len = 4;
  2186.           item_values[2].value = (CHARTYPE *)"MONO";
  2187.           item_values[2].len = 4;
  2188.          break;
  2189. #endif
  2190.     case ITEM_MSGLINE:
  2191.          item_values[1].value = (CHARTYPE *)"ON";
  2192.          item_values[1].len = 2;
  2193.          if (CURRENT_VIEW->msgline_base == POSITION_MIDDLE)
  2194.             sprintf(rsrvd,"M%+d",CURRENT_VIEW->msgline_off);
  2195.          else
  2196.             sprintf(rsrvd,"%d",CURRENT_VIEW->msgline_off);
  2197.          item_values[2].value = rsrvd;
  2198.          item_values[2].len = strlen(rsrvd);
  2199.          sprintf(num1,"%d",CURRENT_VIEW->msgline_rows);
  2200.          item_values[3].value = num1;
  2201.          item_values[3].len = strlen(num1);
  2202.          item_values[4].value = (CHARTYPE *)"OVERLAY";
  2203.          item_values[4].len = 7;
  2204.          break;
  2205.     case ITEM_MSGMODE:
  2206.          if (CURRENT_VIEW->msgmode_status)
  2207.            {
  2208.             item_values[1].value = (CHARTYPE *)"ON";
  2209.             item_values[1].len = 2;
  2210.            }
  2211.           else
  2212.            {
  2213.             item_values[1].value = (CHARTYPE *)"OFF";
  2214.             item_values[1].len = 3;
  2215.            }
  2216.          break;
  2217.     case ITEM_NBFILE:
  2218.          sprintf(num1,"%d",number_of_files);
  2219.          item_values[1].value = num1;
  2220.          item_values[1].len = strlen(num1);
  2221.          break;
  2222.     case ITEM_NEWLINES:
  2223.          if (CURRENT_VIEW->newline_aligned)
  2224.            {
  2225.             item_values[1].value = (CHARTYPE *)"ALIGNED";
  2226.             item_values[1].len = 7;
  2227.            }
  2228.           else
  2229.            {
  2230.             item_values[1].value = (CHARTYPE *)"LEFT";
  2231.             item_values[1].len = 4;
  2232.            }
  2233.          break;
  2234.     case ITEM_NONDISP:
  2235.          num1[0] = NONDISPx;
  2236.          num1[1] ='\0';
  2237.          item_values[1].value = num1;
  2238.          item_values[1].len = 1;
  2239.          break;
  2240.     case ITEM_NUMBER:
  2241.          if (CURRENT_VIEW->number)
  2242.            {
  2243.             item_values[1].value = (CHARTYPE *)"ON";
  2244.             item_values[1].len = 2;
  2245.            }
  2246.          else
  2247.            {
  2248.             item_values[1].value = (CHARTYPE *)"OFF";
  2249.             item_values[1].len = 3;
  2250.            }
  2251.          break;
  2252.     case ITEM_PENDING:
  2253.          number_variables = extract_pending(itemno,itemargs);
  2254.          break;
  2255.     case ITEM_POINT:
  2256.          switch(query_type)
  2257.            {
  2258.             case QUERY_STATUS:
  2259.             case QUERY_QUERY:
  2260.             case QUERY_MODIFY:
  2261.                  true_line = get_true_line();
  2262.                  curr = lll_find(CURRENT_FILE->first_line,true_line);
  2263.                  if (curr->name == NULL)  /* line not named */
  2264.                    {
  2265.                     item_values[1].value = (CHARTYPE *)"";
  2266.                     item_values[1].len = 0;
  2267.                    }
  2268.                  else
  2269.                    {
  2270.                     item_values[1].value = curr->name;
  2271.                     item_values[1].len = strlen(curr->name);
  2272.                    }
  2273.                  break;
  2274.             default:
  2275.                  number_variables = extract_point(itemno,itemargs);
  2276.                  break;
  2277.            }
  2278.          break;
  2279.     case ITEM_POSITION:
  2280.          if (CURRENT_VIEW->position_status)
  2281.            {
  2282.             item_values[1].value = (CHARTYPE *)"ON";
  2283.             item_values[1].len = 2;
  2284.            }
  2285.           else
  2286.            {
  2287.             item_values[1].value = (CHARTYPE *)"OFF";
  2288.             item_values[1].len = 3;
  2289.            }
  2290.          get_current_position(&true_line,&x);
  2291.          sprintf(num1,"%ld",true_line);
  2292.          item_values[2].value = num1;
  2293.          item_values[2].len = strlen(num1);
  2294.          sprintf(num2,"%d",x);
  2295.          item_values[3].value = num2;
  2296.          item_values[3].len = strlen(num2);
  2297.          break;
  2298.     case ITEM_PREFIX:
  2299.          if (rexx_support)
  2300.            {
  2301.             if (strcmp(itemargs,"") != 0)
  2302.               {
  2303.                number_variables = extract_prefix(itemno,itemargs);
  2304.                break;
  2305.               }
  2306.            }
  2307.          else
  2308.            {
  2309.             if (strcmp(itemargs,"") != 0)
  2310.               {
  2311.                display_error(2,(CHARTYPE *)itemargs,FALSE);
  2312.                number_variables = EXTRACT_ARG_ERROR;
  2313.                break;
  2314.               }
  2315.            }
  2316.          if (CURRENT_VIEW->prefix == PREFIX_OFF)
  2317.            {
  2318.             item_values[1].value = (CHARTYPE *)"OFF";
  2319.             item_values[1].len = 3;
  2320.             item_values[2].value = (CHARTYPE *)"";  /* this set to empty deliberately */
  2321.             item_values[2].len = 0;
  2322.             number_variables = 1;
  2323.             break;
  2324.            }
  2325.          if ((CURRENT_VIEW->prefix&PREFIX_STATUS_MASK) == PREFIX_ON)
  2326.            {
  2327.             item_values[1].value = (CHARTYPE *)"ON";
  2328.             item_values[1].len = 2;
  2329.            }
  2330.          else
  2331.            {
  2332.             item_values[1].value = (CHARTYPE *)"NULLS";
  2333.             item_values[1].len = 5;
  2334.            }
  2335.          if ((CURRENT_VIEW->prefix&PREFIX_LOCATION_MASK) == PREFIX_LEFT)
  2336.            {
  2337.             item_values[2].value = (CHARTYPE *)"LEFT";
  2338.             item_values[2].len = 4;
  2339.            }
  2340.          else
  2341.            {
  2342.             item_values[2].value = (CHARTYPE *)"RIGHT";
  2343.             item_values[2].len = 5;
  2344.            }
  2345.          number_variables = 2;
  2346.          break;
  2347.     case ITEM_PRINTER:
  2348. #if defined(UNIX) || defined(OS2)
  2349.          item_values[1].value = (CHARTYPE *)spooler_name;
  2350.          item_values[1].len = strlen(spooler_name);
  2351. #else
  2352.          item_values[1].value = (CHARTYPE *)"LPT1";
  2353.          item_values[1].len = 4;
  2354. #endif
  2355.          break;
  2356.     case ITEM_REPROFILE:
  2357.          if (REPROFILEx)
  2358.            {
  2359.             item_values[1].value = (CHARTYPE *)"ON";
  2360.             item_values[1].len = 2;
  2361.            }
  2362.          else
  2363.            {
  2364.             item_values[1].value = (CHARTYPE *)"OFF";
  2365.             item_values[1].len = 3;
  2366.            }
  2367.          break;
  2368.     case ITEM_READV:
  2369.          key = my_getch(stdscr);
  2370.          keyname = get_key_name(key);
  2371.          if (keyname == NULL)
  2372.            {
  2373.             item_values[1].value = (CHARTYPE *)"";
  2374.             item_values[1].len = 0;
  2375.            }
  2376.          else
  2377.            {
  2378.             item_values[1].value = keyname;
  2379.             item_values[1].len = strlen(keyname);
  2380.            }
  2381.          if (key < 256)
  2382.            {
  2383.             sprintf(num1,"%d",key);
  2384.             item_values[2].value = num1;
  2385.             item_values[2].len = strlen(num1);
  2386.            }
  2387.          else
  2388.            {
  2389.             item_values[2].value = (CHARTYPE *)"";
  2390.             item_values[2].len = 0;
  2391.            }
  2392.          sprintf(num2,"%d",key);
  2393.          item_values[3].value = num2;
  2394.          item_values[3].len = strlen(num2);
  2395.          break;
  2396.     case ITEM_RESERVED:
  2397.          curr_rsrvd = CURRENT_FILE->first_reserved;
  2398.          strcpy(rsrvd,"");
  2399.          while(curr_rsrvd != NULL)
  2400.            {
  2401.             y = strlen(curr_rsrvd->spec) + 1;
  2402.             if ((x + y) > 80)
  2403.                break;
  2404.             strcat(rsrvd,curr_rsrvd->spec);
  2405.             strcat(rsrvd," ");
  2406.             x += y;
  2407.             curr_rsrvd = curr_rsrvd->next;
  2408.            }
  2409.          if (x == 0)
  2410.             number_variables = 0;
  2411.           else
  2412.            {
  2413.             item_values[1].value = rsrvd;
  2414.             item_values[1].len = x;
  2415.            }
  2416.          break;
  2417.     case ITEM_REXXOUTPUT:
  2418.          if (CAPREXXOUTx)
  2419.            {
  2420.             item_values[1].value = (CHARTYPE *)"FILE";
  2421.             item_values[1].len = 4;
  2422.            }
  2423.           else
  2424.            {
  2425.             item_values[1].value = (CHARTYPE *)"DISPLAY";
  2426.             item_values[1].len = 7;
  2427.            }
  2428.          sprintf(num1,"%d",CAPREXXMAXx);
  2429.          item_values[2].value = num1;
  2430.          item_values[2].len = strlen(num1);
  2431.          break;
  2432.     case ITEM_RIGHTEDGE_FUNCTION:
  2433.          getyx(CURRENT_WINDOW,y,x);
  2434.          if (CURRENT_VIEW->current_window == WINDOW_MAIN
  2435.          &&  x == getmaxx(CURRENT_WINDOW)-1)
  2436.            {
  2437.             item_values[1].value = (CHARTYPE *)"1";
  2438.             item_values[1].len = 1;
  2439.            }
  2440.           else
  2441.            {
  2442.             item_values[1].value = (CHARTYPE *)"0";
  2443.             item_values[1].len = 1;
  2444.            }
  2445.          break;
  2446.     case ITEM_SCOPE:
  2447.          if (CURRENT_VIEW->scope_all)
  2448.            {
  2449.             item_values[1].value = (CHARTYPE *)"ALL";
  2450.             item_values[1].len = 3;
  2451.            }
  2452.           else
  2453.            {
  2454.             item_values[1].value = (CHARTYPE *)"DISPLAY";
  2455.             item_values[1].len = 7;
  2456.            }
  2457.          break;
  2458.     case ITEM_SCALE:
  2459.          if (CURRENT_VIEW->scale_on)
  2460.            {
  2461.             item_values[1].value = (CHARTYPE *)"ON";
  2462.             item_values[1].len = 2;
  2463.            }
  2464.           else
  2465.            {
  2466.             item_values[1].value = (CHARTYPE *)"OFF";
  2467.             item_values[1].len = 3;
  2468.            }
  2469.          if (CURRENT_VIEW->scale_base == POSITION_MIDDLE)
  2470.             sprintf(rsrvd,"M%+d",CURRENT_VIEW->scale_off);
  2471.          else
  2472.             sprintf(rsrvd,"%d",CURRENT_VIEW->scale_off);
  2473.          item_values[2].value = rsrvd;
  2474.          item_values[2].len = strlen(rsrvd);
  2475.          break;
  2476.     case ITEM_SELECT:
  2477.          curr = lll_find(CURRENT_FILE->first_line,get_true_line());
  2478.          sprintf(num1,"%d",curr->select);
  2479.          item_values[1].value = num1;
  2480.          item_values[1].len = strlen(num1);
  2481.          x = 0;
  2482.          curr = lll_find(CURRENT_FILE->first_line,1L);
  2483.          while(curr->next != NULL)
  2484.            {
  2485.             if (curr->select > x)
  2486.                x = curr->select;
  2487.             curr = curr->next;
  2488.            }
  2489.          sprintf(num2,"%d",x);
  2490.          item_values[2].value = num2;
  2491.          item_values[2].len = strlen(num2);
  2492.          break;
  2493.     case ITEM_SHADOW:
  2494.          if (CURRENT_VIEW->shadow)
  2495.            {
  2496.             item_values[1].value = (CHARTYPE *)"ON";
  2497.             item_values[1].len = 2;
  2498.            }
  2499.           else
  2500.            {
  2501.             item_values[1].value = (CHARTYPE *)"OFF";
  2502.             item_values[1].len = 3;
  2503.            }
  2504.          break;
  2505.     case ITEM_SIZE:
  2506.          sprintf(num1,"%d",CURRENT_FILE->number_lines);
  2507.          item_values[1].value = num1;
  2508.          item_values[1].len = strlen(num1);
  2509.          break;
  2510.     case ITEM_SPACECHAR_FUNCTION:
  2511.          cursor_char = (CHARTYPE)(winch(CURRENT_WINDOW) & A_CHARTEXT);
  2512.          if (cursor_char == ' ')
  2513.            {
  2514.             item_values[1].value = (CHARTYPE *)"1";
  2515.             item_values[1].len = 1;
  2516.            }
  2517.           else
  2518.            {
  2519.             item_values[1].value = (CHARTYPE *)"0";
  2520.             item_values[1].len = 1;
  2521.            }
  2522.          break;
  2523.     case ITEM_STATUSLINE:
  2524.          switch(STATUSLINEx)
  2525.            {
  2526.             case 'B':
  2527.                  item_values[1].value = (CHARTYPE *)"BOTTOM";
  2528.                  item_values[1].len = 6;
  2529.                  break;
  2530.             case 'T':
  2531.                  item_values[1].value = (CHARTYPE *)"TOP";
  2532.                  item_values[1].len = 3;
  2533.                  break;
  2534.             case 'O':
  2535.                  item_values[1].value = (CHARTYPE *)"OFF";
  2536.                  item_values[1].len = 3;
  2537.                  break;
  2538.             case 'G':
  2539.                  item_values[1].value = (CHARTYPE *)"GUI";
  2540.                  item_values[1].len = 3;
  2541.                  break;
  2542.            }
  2543.          break;
  2544.     case ITEM_STAY:
  2545.          if (CURRENT_VIEW->stay)
  2546.            {
  2547.             item_values[1].value = (CHARTYPE *)"ON";
  2548.             item_values[1].len = 2;
  2549.            }
  2550.           else
  2551.            {
  2552.             item_values[1].value = (CHARTYPE *)"OFF";
  2553.             item_values[1].len = 3;
  2554.            }
  2555.          break;
  2556.     case ITEM_TABKEY:
  2557.          if (tabkey_insert == 'T')
  2558.            {
  2559.             item_values[1].value = (CHARTYPE *)"TAB";
  2560.             item_values[1].len = 3;
  2561.            }
  2562.           else
  2563.            {
  2564.             item_values[1].value = (CHARTYPE *)"CHARACTER";
  2565.             item_values[1].len = 9;
  2566.            }
  2567.          if (tabkey_overwrite == 'T')
  2568.            {
  2569.             item_values[2].value = (CHARTYPE *)"TAB";
  2570.             item_values[2].len = 3;
  2571.            }
  2572.           else
  2573.            {
  2574.             item_values[2].value = (CHARTYPE *)"CHARACTER";
  2575.             item_values[2].len = 9;
  2576.            }
  2577.          break;
  2578.     case ITEM_TABLINE:
  2579.          if (CURRENT_VIEW->tab_on)
  2580.            {
  2581.             item_values[1].value = (CHARTYPE *)"ON";
  2582.             item_values[1].len = 2;
  2583.            }
  2584.           else
  2585.            {
  2586.             item_values[1].value = (CHARTYPE *)"OFF";
  2587.             item_values[1].len = 3;
  2588.            }
  2589.          if (CURRENT_VIEW->tab_base == POSITION_MIDDLE)
  2590.             sprintf(rsrvd,"M%+d",CURRENT_VIEW->tab_off);
  2591.          else
  2592.             sprintf(rsrvd,"%d",CURRENT_VIEW->tab_off);
  2593.          item_values[2].value = rsrvd;
  2594.          item_values[2].len = strlen(rsrvd);
  2595.          break;
  2596.     case ITEM_TABS:
  2597.          strcpy(rsrvd,"");
  2598.          for (i=0;i<CURRENT_VIEW->numtabs;i++)
  2599.            {
  2600.             sprintf(num1,"%d ",CURRENT_VIEW->tabs[i]);
  2601.             strcat(rsrvd,num1);
  2602.            }
  2603.          if (query_type == QUERY_STATUS
  2604.          ||  query_type == QUERY_QUERY
  2605.          ||  query_type == QUERY_MODIFY)
  2606.             rsrvd[COLS-7] = '\0';
  2607.          item_values[1].value = rsrvd;
  2608.          item_values[1].len = strlen(rsrvd);
  2609.          break;
  2610.     case ITEM_TABSIN:
  2611.          if (TABI_ONx)
  2612.            {
  2613.             item_values[1].value = (CHARTYPE *)"ON";
  2614.             item_values[1].len = 2;
  2615.            }
  2616.           else
  2617.            {
  2618.             item_values[1].value = (CHARTYPE *)"OFF";
  2619.             item_values[1].len = 3;
  2620.            }
  2621.          sprintf(num1,"%d",TABI_Nx);
  2622.          item_values[2].value = num1;
  2623.          item_values[2].len = strlen(num1);
  2624.          break;
  2625.     case ITEM_TABSOUT:
  2626.          if (CURRENT_FILE->tabsout_on)
  2627.            {
  2628.             item_values[1].value = (CHARTYPE *)"ON";
  2629.             item_values[1].len = 2;
  2630.            }
  2631.           else
  2632.            {
  2633.             item_values[1].value = (CHARTYPE *)"OFF";
  2634.             item_values[1].len = 3;
  2635.            }
  2636.          sprintf(num1,"%d",CURRENT_FILE->tabsout_num);
  2637.          item_values[2].value = num1;
  2638.          item_values[2].len = strlen(num1);
  2639.          break;
  2640.     case ITEM_TERMINAL:
  2641.          item_values[1].value = term_name;
  2642.          item_values[1].len = strlen(term_name);
  2643.          break;
  2644.     case ITEM_TOF:
  2645.          if (CURRENT_TOF)
  2646.            {
  2647.             item_values[1].value = (CHARTYPE *)"ON";
  2648.             item_values[1].len = 2;
  2649.            }
  2650.           else
  2651.            {
  2652.             item_values[1].value = (CHARTYPE *)"OFF";
  2653.             item_values[1].len = 3;
  2654.            }
  2655.          break;
  2656.     case ITEM_TOF_FUNCTION:
  2657.          if (FOCUS_TOF && CURRENT_VIEW->current_window != WINDOW_COMMAND)
  2658.            {
  2659.             item_values[1].value = (CHARTYPE *)"1";
  2660.             item_values[1].len = 1;
  2661.            }
  2662.           else
  2663.            {
  2664.             item_values[1].value = (CHARTYPE *)"0";
  2665.             item_values[1].len = 1;
  2666.            }
  2667.          break;
  2668.     case ITEM_TOPEDGE_FUNCTION:
  2669.          getyx(CURRENT_WINDOW,y,x);
  2670.          if (CURRENT_VIEW->current_window == WINDOW_MAIN
  2671.          &&  y == 0)
  2672.            {
  2673.             item_values[1].value = (CHARTYPE *)"1";
  2674.             item_values[1].len = 1;
  2675.            }
  2676.           else
  2677.            {
  2678.             item_values[1].value = (CHARTYPE *)"0";
  2679.             item_values[1].len = 1;
  2680.            }
  2681.          break;
  2682.     case ITEM_VALID_TARGET_FUNCTION:
  2683.          target_type=TARGET_NORMAL|TARGET_BLOCK_CURRENT|TARGET_ALL;
  2684.          if (argc < 1 || argc > 2)  /* incorrect no of arguments - error */
  2685.            {
  2686.             item_values[1].value = (CHARTYPE *)"ERROR";
  2687.             item_values[1].len = 5;
  2688.             break;
  2689.            }
  2690.          if (argc == 2)
  2691.             target_type = target_type | TARGET_SPARE;
  2692. /* allocate sufficient space for the spare string and 2 longs */
  2693.          if (tarbuf == NULL)
  2694.             tarbuf = (CHARTYPE *)(*the_malloc)(sizeof(CHARTYPE)*(arglen+30));
  2695.          else
  2696.             tarbuf = (CHARTYPE *)(*the_realloc)(tarbuf,sizeof(CHARTYPE)*(arglen+30));
  2697.          if (tarbuf == (CHARTYPE *)NULL)
  2698.            {
  2699.             item_values[1].value = (CHARTYPE *)"ERROR";
  2700.             item_values[1].len = 5;
  2701.             free_target(&target);
  2702.             break;
  2703.            }
  2704.          memcpy(tarbuf,arg,arglen);
  2705.          *(tarbuf+arglen) = '\0';
  2706.          if (in_prefix_macro)
  2707.             true_line = prefix_current_line;
  2708.          else
  2709.             true_line = get_true_line();
  2710.  
  2711.          initialise_target(&target);
  2712.          rc = validate_target(tarbuf,&target,target_type,true_line,FALSE,FALSE);
  2713.          if (rc == RC_TARGET_NOT_FOUND)
  2714.            {
  2715.             item_values[1].value = (CHARTYPE *)"NOTFOUND";
  2716.             item_values[1].len = 8;
  2717.             free_target(&target);
  2718.             break;
  2719.            }
  2720.          if (rc != RC_OK)
  2721.            {
  2722.             item_values[1].value = (CHARTYPE *)"ERROR";
  2723.             item_values[1].len = 5;
  2724.             free_target(&target);
  2725.             break;
  2726.            }
  2727.          if (argc == 2
  2728.          &&  target.spare != (-1))
  2729.             sprintf(tarbuf,"%ld %ld %s",target.true_line,target.num_lines,
  2730.                                         target.rt[target.spare].string);
  2731.          else
  2732.              sprintf(tarbuf,"%ld %ld",target.true_line,target.num_lines);
  2733.          item_values[1].value = tarbuf;
  2734.          item_values[1].len = strlen(tarbuf);
  2735.          free_target(&target);
  2736.          break;
  2737.     case ITEM_VERIFY:
  2738.          sprintf(num3,"%d %d",CURRENT_VIEW->verify_start,CURRENT_VIEW->verify_end);
  2739.          item_values[1].value = num3;
  2740.          item_values[1].len = strlen(num3);
  2741.          break;
  2742.     case ITEM_VERSHIFT:
  2743.          sprintf(rsrvd,"%ld",(LINETYPE)CURRENT_VIEW->verify_col - (LINETYPE)CURRENT_VIEW->verify_start);
  2744.          item_values[1].value = rsrvd;
  2745.          item_values[1].len = strlen(rsrvd);
  2746.          break;
  2747.     case ITEM_VERONE_FUNCTION:
  2748.          if (CURRENT_VIEW->verify_col == 1)
  2749.            {
  2750.             item_values[1].value = (CHARTYPE *)"1";
  2751.             item_values[1].len = 1;
  2752.            }
  2753.           else
  2754.            {
  2755.             item_values[1].value = (CHARTYPE *)"0";
  2756.             item_values[1].len = 1;
  2757.            }
  2758.          break;
  2759.     case ITEM_VERSION:
  2760.          item_values[1].value = (CHARTYPE *)"THE";
  2761.          item_values[1].len = 3;
  2762.          item_values[2].value = (CHARTYPE *)the_version;
  2763.          item_values[2].len = strlen(the_version);
  2764.          item_values[3].value = (CHARTYPE *)"???";
  2765. #if defined(DOS)
  2766.          item_values[3].value = (CHARTYPE *)"DOS";
  2767. #endif
  2768. #if defined(OS2)
  2769.          item_values[3].value = (CHARTYPE *)"OS2";
  2770. #endif
  2771. #if defined(UNIX)
  2772.          item_values[3].value = (CHARTYPE *)"UNIX";
  2773. #endif
  2774. #if defined(MSWIN)
  2775.          item_values[3].value = (CHARTYPE *)"MS-WINDOWS";
  2776. #endif
  2777.          item_values[3].len = strlen(item_values[3].value);
  2778.          item_values[4].value = (CHARTYPE *)"26-Jan-95";
  2779.          item_values[4].len = strlen(item_values[4].value);
  2780.          break;
  2781.     case ITEM_WIDTH:
  2782.          sprintf(num1,"%d",max_line_length);
  2783.          item_values[1].value = num1;
  2784.          item_values[1].len = strlen(num1);
  2785.          break;
  2786.     case ITEM_WORDWRAP:
  2787.          if (CURRENT_VIEW->wordwrap)
  2788.            {
  2789.             item_values[1].value = (CHARTYPE *)"ON";
  2790.             item_values[1].len = 2;
  2791.            }
  2792.           else
  2793.            {
  2794.             item_values[1].value = (CHARTYPE *)"OFF";
  2795.             item_values[1].len = 3;
  2796.            }
  2797.          break;
  2798.     case ITEM_ZONE:
  2799.          sprintf(num1,"%d",CURRENT_VIEW->zone_start);
  2800.          item_values[1].value = num1;
  2801.          item_values[1].len = strlen(num1);
  2802.          sprintf(num2,"%d",CURRENT_VIEW->zone_end);
  2803.          item_values[2].value = num2;
  2804.          item_values[2].len = strlen(num2);
  2805.          break;
  2806.     default:
  2807.          break;
  2808.    }
  2809. /*---------------------------------------------------------------------*/
  2810. /* If an "error" condition exists, do not set any values.              */
  2811. /*---------------------------------------------------------------------*/
  2812.  if (number_variables >= 0)
  2813.    {
  2814.     switch(query_type)
  2815.       {
  2816.        case QUERY_EXTRACT:
  2817.        case QUERY_FUNCTION:
  2818.        case QUERY_READV:
  2819.             sprintf(num0,"%d",number_variables);
  2820.             item_values[0].value = num0;
  2821.             item_values[0].len = strlen(num0);
  2822.             break;
  2823.        case QUERY_STATUS:
  2824.        case QUERY_QUERY:
  2825.        case QUERY_MODIFY:
  2826.             item_values[0].value = query_item[itemno].name;
  2827.             item_values[0].len = strlen(query_item[itemno].name);
  2828.             break;
  2829.        default:
  2830.             break;
  2831.       }
  2832.    }
  2833. #ifdef TRACE
  2834.  trace_return();
  2835. #endif
  2836.  return(number_variables);
  2837. }
  2838. /***********************************************************************/
  2839. #ifdef PROTO
  2840. static short extract_point(short itemno,CHARTYPE *params)
  2841. #else
  2842. static short extract_point(itemno,params)
  2843. short itemno;
  2844. CHARTYPE *params;
  2845. #endif
  2846. /***********************************************************************/
  2847. {
  2848. /*-------------------------- external data ----------------------------*/
  2849. /*--------------------------- local data ------------------------------*/
  2850.  register short i=0;
  2851.  short number_variables = query_item[itemno].number_values;
  2852.  static CHARTYPE num4[15];
  2853.  LINE *curr=NULL;
  2854.  LINETYPE true_line=0L;
  2855.  short rc=RC_OK;
  2856. /*--------------------------- processing ------------------------------*/
  2857. #ifdef TRACE
  2858.  trace_function("query.c:   extract_point");
  2859. #endif
  2860.  if (strcmp(params,"") == 0) /* get name for focus line only */
  2861.    {
  2862.     true_line = get_true_line();
  2863.     curr = lll_find(CURRENT_FILE->first_line,true_line);
  2864.     if (curr->name == NULL)  /* line not named */
  2865.        number_variables = 0;
  2866.     else
  2867.       {
  2868.        sprintf(num4,"%d %s",true_line,curr->name);
  2869.        item_values[1].value = num4;
  2870.        item_values[1].len = strlen(num4);
  2871.        number_variables = 1;
  2872.       }
  2873.    }
  2874.  else
  2875.    {
  2876.     if (strcmp(params,"*") != 0)     /* argument must be "*" */
  2877.       {
  2878.        display_error(1,(CHARTYPE *)params,FALSE);
  2879.        number_variables = EXTRACT_ARG_ERROR;
  2880.       }
  2881.     else
  2882.       {
  2883.        curr = CURRENT_FILE->first_line;
  2884.        for(true_line=0,i=0;curr != NULL;true_line++)
  2885.          {
  2886.           if (curr->name != NULL)  /* line is named */
  2887.             {
  2888.              sprintf(num4,"%d %s",true_line,curr->name);
  2889.              rc = set_rexx_variable(query_item[itemno].name,num4,++i);
  2890.              if (rc == RC_SYSTEM_ERROR)
  2891.                {
  2892.                 display_error(54,(CHARTYPE *)"",FALSE);
  2893. #ifdef TRACE
  2894.                 trace_return();
  2895. #endif
  2896.                 return(EXTRACT_ARG_ERROR);
  2897.                }
  2898.             }
  2899.           curr = curr->next;
  2900.          }
  2901.        sprintf(num4,"%d",i);
  2902.        rc = set_rexx_variable(query_item[itemno].name,num4,0);
  2903.        if (rc == RC_SYSTEM_ERROR)
  2904.          {
  2905.           display_error(54,(CHARTYPE *)"",FALSE);
  2906.           number_variables = EXTRACT_ARG_ERROR;
  2907.          }
  2908.        else
  2909.           number_variables = EXTRACT_VARIABLES_SET;
  2910.       }
  2911.    }
  2912. #ifdef TRACE
  2913.  trace_return();
  2914. #endif
  2915.  return(number_variables);
  2916. }
  2917. /***********************************************************************/
  2918. #ifdef PROTO
  2919. static short extract_pending(short itemno,CHARTYPE *params)
  2920. #else
  2921. static short extract_pending(itemno,params)
  2922. short itemno;
  2923. CHARTYPE *params;
  2924. #endif
  2925. /***********************************************************************/
  2926. {
  2927. /*-------------------------- external data ----------------------------*/
  2928. /*--------------------------- local data ------------------------------*/
  2929.  register short i=0;
  2930. #define PEN_PARAMS  4
  2931.  CHARTYPE *word[PEN_PARAMS+1];
  2932.  unsigned short num_params=0;
  2933.  short number_variables = query_item[itemno].number_values;
  2934.  bool find_block=FALSE;
  2935.  bool find_oldname=FALSE;
  2936.  bool valid_args = FALSE;
  2937.  CHARTYPE *name=NULL;
  2938.  static CHARTYPE num1[7];
  2939.  PPC *curr_ppc=NULL;
  2940. /*--------------------------- processing ------------------------------*/
  2941. #ifdef TRACE
  2942.  trace_function("query.c:   extract_pending");
  2943. #endif
  2944.  num_params = param_split(params,word,PEN_PARAMS,WORD_DELIMS,TEMP_PARAM);
  2945.  switch(num_params)
  2946.    {
  2947. /*---------------------------------------------------------------------*/
  2948. /* No parameters, error.                                               */
  2949. /*---------------------------------------------------------------------*/
  2950.     case 0:
  2951.            display_error(3,(CHARTYPE *)"",FALSE);
  2952.            number_variables = EXTRACT_ARG_ERROR;
  2953.            break;
  2954. /*---------------------------------------------------------------------*/
  2955. /* 1  parameter, only name.                                            */
  2956. /*---------------------------------------------------------------------*/
  2957.     case 1:
  2958.            if (equal((CHARTYPE *)"block",word[0],5)
  2959.            ||  equal((CHARTYPE *)"oldname",word[0],7))
  2960.              {
  2961.               display_error(3,(CHARTYPE *)"",FALSE);
  2962.               number_variables = EXTRACT_ARG_ERROR;
  2963.               break;
  2964.              }
  2965.            name = word[0];
  2966.            break;
  2967. /*---------------------------------------------------------------------*/
  2968. /* 2  parameters, BLOCK and name or OLDNAME and name.                  */
  2969. /*---------------------------------------------------------------------*/
  2970.     case 2:
  2971.            if (equal((CHARTYPE *)"block",word[0],5)
  2972.            &&  equal((CHARTYPE *)"oldname",word[1],7))
  2973.              {
  2974.               display_error(3,(CHARTYPE *)"",FALSE);
  2975.               number_variables = EXTRACT_ARG_ERROR;
  2976.               break;
  2977.              }
  2978.            if (equal((CHARTYPE *)"block",word[1],5)
  2979.            &&  equal((CHARTYPE *)"oldname",word[0],7))
  2980.              {
  2981.               display_error(3,(CHARTYPE *)"",FALSE);
  2982.               number_variables = EXTRACT_ARG_ERROR;
  2983.               break;
  2984.              }
  2985.            if (equal((CHARTYPE *)"block",word[0],5))
  2986.              {
  2987.               name = word[1];
  2988.               find_block = TRUE;
  2989.               break;
  2990.              }
  2991.            if (equal((CHARTYPE *)"oldname",word[0],7))
  2992.              {
  2993.               name = word[1];
  2994.               find_oldname = TRUE;
  2995.               break;
  2996.              }
  2997.            display_error(1,word[0],FALSE);
  2998.            number_variables = EXTRACT_ARG_ERROR;
  2999.            break;
  3000. /*---------------------------------------------------------------------*/
  3001. /* 3  parameters, BLOCK and OLDNAME and name.                          */
  3002. /*---------------------------------------------------------------------*/
  3003.     case 3:
  3004.            if (equal((CHARTYPE *)"block",word[0],5)
  3005.            &&  equal((CHARTYPE *)"oldname",word[1],7))
  3006.               valid_args = TRUE;
  3007.            if (equal((CHARTYPE *)"block",word[1],5)
  3008.            &&  equal((CHARTYPE *)"oldname",word[0],7))
  3009.               valid_args = TRUE;
  3010.            if (!valid_args)
  3011.              {
  3012.               display_error(1,word[0],FALSE);
  3013.               number_variables = EXTRACT_ARG_ERROR;
  3014.               break;
  3015.              }
  3016.            find_block = find_oldname = TRUE;
  3017.            name = word[2];
  3018.            break;
  3019. /*---------------------------------------------------------------------*/
  3020. /* Too many parameters, error.                                         */
  3021. /*---------------------------------------------------------------------*/
  3022.     default:
  3023.            display_error(2,(CHARTYPE *)"",FALSE);
  3024.            number_variables = EXTRACT_ARG_ERROR;
  3025.            break;
  3026.    }
  3027. /*---------------------------------------------------------------------*/
  3028. /* If the validation of parameters is successful...                    */
  3029. /*---------------------------------------------------------------------*/
  3030.  if (number_variables >= 0)
  3031.    {
  3032. /*---------------------------------------------------------------------*/
  3033. /* No pending prefix commands, return 0.                               */
  3034. /*---------------------------------------------------------------------*/
  3035.     if (CURRENT_FILE->first_ppc == NULL)
  3036.        number_variables = 0;
  3037.     else
  3038. /*---------------------------------------------------------------------*/
  3039. /* Have to search each pending prefix command...                       */
  3040. /*---------------------------------------------------------------------*/
  3041.       {
  3042. /*---------------------------------------------------------------------*/
  3043. /* If we are to look for OLDNAME, find a synonym for it if one exists..*/
  3044. /*---------------------------------------------------------------------*/
  3045.        if (find_oldname)
  3046.           name = find_prefix_oldname(name);
  3047. /*---------------------------------------------------------------------*/
  3048. /* For each pending prefix command...                                  */
  3049. /*---------------------------------------------------------------------*/
  3050.        curr_ppc = CURRENT_FILE->first_ppc;
  3051.        while(1)
  3052.          {
  3053.           if (curr_ppc == NULL)
  3054.              break;
  3055. /*---------------------------------------------------------------------*/
  3056. /* If we want to match on any name...                                  */
  3057. /*---------------------------------------------------------------------*/
  3058.           if (strcmp(name,"*") == 0)
  3059.             {
  3060. /*---------------------------------------------------------------------*/
  3061. /* Are we matching on any BLOCK command...                             */
  3062. /*---------------------------------------------------------------------*/
  3063.              if (find_block)
  3064.                {
  3065.                 if (curr_ppc->ppc_block_command)
  3066. /*---------------------------------------------------------------------*/
  3067. /* We have found the first BLOCK command with any name.                */
  3068. /*---------------------------------------------------------------------*/
  3069.                    break;
  3070.                 else
  3071.                   {
  3072. /*---------------------------------------------------------------------*/
  3073. /* Go back and look for another...                                     */
  3074. /*---------------------------------------------------------------------*/
  3075.                    curr_ppc = curr_ppc->next;
  3076.                    continue;
  3077.                   }
  3078.                }
  3079.              else
  3080. /*---------------------------------------------------------------------*/
  3081. /* We have found the first command with any name.                      */
  3082. /*---------------------------------------------------------------------*/
  3083.                 break;
  3084.             }
  3085. /*---------------------------------------------------------------------*/
  3086. /* We want to find a specific command...                               */
  3087. /*---------------------------------------------------------------------*/
  3088.           if (strcmp(curr_ppc->ppc_command,name) == 0)
  3089.             {
  3090. /*---------------------------------------------------------------------*/
  3091. /* Are we looking for a specific BLOCK command...                      */
  3092. /*---------------------------------------------------------------------*/
  3093.              if (find_block)
  3094.                {
  3095.                 if (curr_ppc->ppc_block_command)
  3096. /*---------------------------------------------------------------------*/
  3097. /* We have found the first specific BLOCK command.                     */
  3098. /*---------------------------------------------------------------------*/
  3099.                    break;
  3100.                }
  3101.              else
  3102. /*---------------------------------------------------------------------*/
  3103. /* We have found the first specific command.                           */
  3104. /*---------------------------------------------------------------------*/
  3105.                 break;
  3106.             }
  3107.           curr_ppc = curr_ppc->next;
  3108.          }
  3109. /*---------------------------------------------------------------------*/
  3110. /* Did we find a matching pending prefix command ?                     */
  3111. /*---------------------------------------------------------------------*/
  3112.        if (curr_ppc == NULL)
  3113.           number_variables = 0;
  3114.        else
  3115.          {
  3116. /*---------------------------------------------------------------------*/
  3117. /* Yes we did. Set all of the REXX variables to the correct values...  */
  3118. /*---------------------------------------------------------------------*/
  3119.           sprintf(num1,"%d",curr_ppc->ppc_line_number);
  3120.           item_values[1].value = num1;
  3121.           item_values[1].len = strlen(num1);
  3122.           item_values[2].value = curr_ppc->ppc_command;
  3123.           item_values[2].len = strlen(item_values[2].value);
  3124.           item_values[3].value = find_prefix_synonym(curr_ppc->ppc_command);
  3125.           item_values[3].len = strlen(item_values[2].value);
  3126.           if (curr_ppc->ppc_block_command)
  3127.              item_values[4].value = (CHARTYPE *)"BLOCK";
  3128.           else
  3129.              item_values[4].value = (CHARTYPE *)"";
  3130.           item_values[4].len = strlen(item_values[4].value);
  3131.          }
  3132.       }
  3133.    }
  3134. #ifdef TRACE
  3135.  trace_return();
  3136. #endif
  3137.  return(number_variables);
  3138. }
  3139. /***********************************************************************/
  3140. #ifdef PROTO
  3141. static short extract_prefix(short itemno,CHARTYPE *params)
  3142. #else
  3143. static short extract_prefix(itemno,params)
  3144. short itemno;
  3145. CHARTYPE *params;
  3146. #endif
  3147. /***********************************************************************/
  3148. {
  3149. /*-------------------------- external data ----------------------------*/
  3150.  extern LINE *first_prefix_synonym;
  3151. /*--------------------------- local data ------------------------------*/
  3152.  register short i=0;
  3153. #define PRE_PARAMS  3
  3154.  CHARTYPE *word[PRE_PARAMS+1];
  3155.  unsigned short num_params=0;
  3156.  short number_variables = query_item[itemno].number_values;
  3157.  static CHARTYPE num4[15];
  3158.  LINE *curr=NULL;
  3159.  short rc=RC_OK;
  3160.  CHARTYPE *tmpbuf=NULL;
  3161. /*--------------------------- processing ------------------------------*/
  3162. #ifdef TRACE
  3163.  trace_function("query.c:   extract_prefix");
  3164. #endif
  3165.  num_params = param_split(params,word,PRE_PARAMS,WORD_DELIMS,TEMP_PARAM);
  3166.  switch(num_params)
  3167.    {
  3168. /*---------------------------------------------------------------------*/
  3169. /* None or 1 parameters, error.                                        */
  3170. /*---------------------------------------------------------------------*/
  3171.     case 0:
  3172.     case 1:
  3173.            display_error(3,(CHARTYPE *)"",FALSE);
  3174.            number_variables = EXTRACT_ARG_ERROR;
  3175.            break;
  3176. /*---------------------------------------------------------------------*/
  3177. /* 2  parameters, Synonym and name.                                    */
  3178. /*---------------------------------------------------------------------*/
  3179.     case 2:
  3180.            if (!equal((CHARTYPE *)"synonym",word[0],1))
  3181.              {
  3182.               display_error(13,(CHARTYPE *)"",FALSE);
  3183.               number_variables = EXTRACT_ARG_ERROR;
  3184.               break;
  3185.              }
  3186.            break;
  3187. /*---------------------------------------------------------------------*/
  3188. /* Too many parameters, error.                                         */
  3189. /*---------------------------------------------------------------------*/
  3190.     default:
  3191.            display_error(2,(CHARTYPE *)"",FALSE);
  3192.            number_variables = EXTRACT_ARG_ERROR;
  3193.            break;
  3194.    }
  3195. /*---------------------------------------------------------------------*/
  3196. /* If the validation of parameters is successful...                    */
  3197. /*---------------------------------------------------------------------*/
  3198.  if (number_variables >= 0)
  3199.    {
  3200.     if (strcmp(word[1],"*") == 0)
  3201. /*---------------------------------------------------------------------*/
  3202. /* Get oldname for all synonyms...                                     */
  3203. /*---------------------------------------------------------------------*/
  3204.       {
  3205.        curr = first_prefix_synonym;
  3206.        i = 0;
  3207.        while(curr != NULL)
  3208.          {
  3209.           tmpbuf = (CHARTYPE *)(*the_malloc)(sizeof(CHARTYPE)*(strlen(curr->name)+strlen(curr->line)+1));
  3210.           if (tmpbuf == (CHARTYPE *)NULL)
  3211.             {
  3212.              display_error(30,(CHARTYPE *)"",FALSE);
  3213. #ifdef TRACE
  3214.              trace_return();
  3215. #endif
  3216.              return(EXTRACT_ARG_ERROR);
  3217.             }
  3218.           strcpy(tmpbuf,curr->name);
  3219.           strcat(tmpbuf," ");
  3220.           strcat(tmpbuf,curr->line);
  3221.           rc = set_rexx_variable(query_item[itemno].name,tmpbuf,++i);
  3222.           (*the_free)(tmpbuf);
  3223.           if (rc == RC_SYSTEM_ERROR)
  3224.             {
  3225.              display_error(54,(CHARTYPE *)"",FALSE);
  3226. #ifdef TRACE
  3227.              trace_return();
  3228. #endif
  3229.              return(EXTRACT_ARG_ERROR);
  3230.             }
  3231.           curr = curr->next;
  3232.          }
  3233.        sprintf(num4,"%d",i);
  3234.        rc = set_rexx_variable(query_item[itemno].name,num4,0);
  3235.        if (rc == RC_SYSTEM_ERROR)
  3236.          {
  3237.           display_error(54,(CHARTYPE *)"",FALSE);
  3238.           number_variables = EXTRACT_ARG_ERROR;
  3239.          }
  3240.        else
  3241.           number_variables = EXTRACT_VARIABLES_SET;
  3242.       }
  3243.     else
  3244. /*---------------------------------------------------------------------*/
  3245. /* Get oldname for named synonym...                                    */
  3246. /*---------------------------------------------------------------------*/
  3247.       {
  3248.        item_values[1].value = find_prefix_synonym(word[1]);
  3249.        item_values[1].len = strlen(item_values[1].value);
  3250.        number_variables = 1;
  3251.       }
  3252.  }
  3253. #ifdef TRACE
  3254.  trace_return();
  3255. #endif
  3256.  return(number_variables);
  3257. }
  3258.